Ottieni un tipo di messaggio personalizzato per una pagina di archivio


14

Come faccio a scoprire la lumaca del tipo di post personalizzato quando mi trovo su una pagina di archivio?

Ad esempio se /products/ spara ilarchive-products.php modello, come (pragmaticamente) ottengo la lumaca di tipo post?

Grazie

Risposte:


18

Per ottenere il tipo di post corrente utilizzare get_post_type(). Quindi chiedi get_post_type_object()tutti i dati di cui hai bisogno, ad esempio la lumaca:

$post_type = get_post_type();
if ( $post_type )
{
    $post_type_data = get_post_type_object( $post_type );
    $post_type_slug = $post_type_data->rewrite['slug'];
    echo $post_type_slug;
}

1
Penso che (non avevo testato) get_queried_object()sarebbe arrivato alle stesse informazioni in meno mosse.
Rarst

@Rarst Forse, ma penso che il codice che ho suggerito sia più facile da capire.
fuxia

1
Le soluzioni di Toscho sono sbagliate, perché get_post_type restituisce il tipo di post della pagina corrente e, quando ci si trova nella pagina di archivio, questa funzione restituisce sempre "page". Sto cercando di risolvere lo stesso: quando mi trovo nella pagina di archivio dei "libri" (esempio 4), voglio questo: "libri". Quando lo avrò lo pubblicherò.
eMarine,

1
sfortunatamente non è così semplice, anche se staresti meglio con $posttype = get_query_var('post_type');... Ho aggiunto un'alternativa completa.
Majick,

Non credo che questa sia la risposta che copra l'intera storia. Dovresti controllare le regole di riscrittura dell'installazione poiché molti filtri (come la pagina del negozio di woocommerce) stanno apportando modifiche. Usa invece il mecanismo del Worpdress , vedi la mia risposta da qualche parte in basso.
Jonas Lundman,

6

Sto usando questo al di fuori del ciclo sul modello archive.php per ottenere l'archivio post personalizzato su cui mi trovo.

È una combinazione dei metodi consigliati sia da @toscho che da @Rarst:

$post_type = get_queried_object();
echo $post_type->rewrite['slug'];

Aggiornamento: @majick ha sottolineato che funziona solo se hai impostato la lumaca di riscrittura per il tuo CPT. La riscrittura della lumaca è facoltativa quando si registra un CPT e per impostazione predefinita è post_type se non impostata.


quando ho provato questo ho ricevutoNotice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
patrickzdb il

funzionerà solo se la lumaca di riscrittura è impostata per il CPT registrato, in quanto è facoltativo e il valore predefinito è post_type
majick,

Grazie per aver catturato quel @majick! Ho aggiornato il post per riflettere le tue informazioni.
Jerry,

si è scoperto che era la punta dell'iceberg ... controlla la mia nuova risposta per la parte subacquea :-)
Majick

3

Le risposte diventano confuse. E forse lo sono anche io, ma la domanda principale è:

Ottenere messaggio personalizzato tipo slug per una pagina di archivio

Se vuoi dire pagina di destinazione dell'archivio di tipo post e quando is_post_type_archive()ritorna true, vuoi la lumaca che risponda all'archivio di visualizzazione corrente :

/* returns /products/ */

$responding_name = str_replace(get_home_url(), '', get_post_type_archive_link(get_query_var('post_type')));

/* continue to get 'products' without slug slashes */
$responding_name = str_replace('/', '', $responding_name);

- FINE RISPOSTA ALLA DOMANDA -

Spiegazione:

Non puoi fare affidamento sulla lumaca registrata . Wordpress non è neanche. Ad esempio, quando si chiama get_post_type_archive_link()Wordpress si verificano le regole di riscrittura correnti per l' installazione .

Ovunque tu sia, loop interno o esterno, archivio corrente o singolo post, inverti il get_post_type_archive_link()meccanismo. (Permalink abilitati.)

considerazioni:

Come menzionato qui, i tipi di post nella query corrente possono essere un array. Puoi andare oltre con le tue intensità con il filtro del tipo di post che cerchi, ad esempio:

$post_type = get_query_var('post_type'); 
if(is_array($post_type)) $post_type = reset($post_type);

o

if(isset($post_types[0])) $post_type = $post_types[0];

Un altro punto di vista:

Esempio di Woocommerce, è registrato con l'oggetto di tipo post "prodotti" ma in realtà usa il nome della regola riscritto (negozio):

/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));

Segna, sto usando $responding_name, perché gli obiettivi potrebbero variare. Non esiste un archivio postale, è solo un URL.


Questo ha reso molto chiaro grazie. Stavo cercando questa soluzione. Se la domanda non cercava "solo il nome del tipo di post", questa dovrebbe essere una risposta più ampia.
Jonas Lundman,

1

Si noti che se has_archiveè impostato su true durante la registrazione del tipo di posta personalizzato, l'archivio del tipo di posta /cptslug/verrà riscritto internamente ?post_type=cptslug. Quindi questo significherebbe ancheis_post_type_archive() che tornerà vero.

Sfortunatamente, dove la lumaca di riscrittura registrata è diversa dal tipo di posta, non si ottiene effettivamente il post_type. per esempio. se il tuo tipo di post era myplugin_carse il tuo slug di riscrittura era carse devi riceverlo, myplugin_carsanche questo (per prevenire errori se l'oggetto interrogato corrente non è un tipo di post personalizzato) fallirà comunque:

$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
    if (isset($queryobject->rewrite['slug'])) {
         $posttype = $queryobject->rewrite['slug'];
     }
 }

Ma poiché is_post_type_archiveè vero, questo è più affidabile:

if (is_post_type_archive()) {
    $posttype = get_query_var('post_type');
    // which is basically the same as:
    // global $wp_query;
    // $posttype = $wp_query->query_vars['post_type'];
} 
else ($posttype = 'post';}

Ma aspetta, c'è di più ... risulta con un piccolo test, non è nemmeno così semplice ... e se ti trovi in ​​una pagina di archivio di tassonomia con più tipi di post nella tassonomia ..? O assegnare tag post a un tipo di post personalizzato diverso da post? Oppure sei su una pagina di archivio dell'autore? Pagina di archivio della data? ... o anche avere un complesso tax_queryo meta_queryperWP_Query ?

L'unica risposta affidabile (senza test per ogni possibile caso di archiviazione) è quella di eseguire il ciclo dei post effettivi nella query ... Ecco la funzione completa che mi è venuta in mente per lavorare su pagine singole e di archivio e che consente di passare facoltativamente un oggetto query personalizzato (o oggetto post / ID post per post singoli):

function get_current_post_types($object=null) {

    // if a numeric value passed, assume it is a post ID
    if ( ($object) && (is_numeric($object)) ) {$object = get_post($object);}
    // if an object is passed, assume to be a post object
    if ( ($object) && (is_object($object)) ) {return get_post_type($object);}

    // standard single post type checks
    if (is_404()) {return '';}
    // update: removed this check, handled by is_singular
    // if (is_single()) {return 'post';}
    if (is_page()) {return 'page';}
    if (is_attachment()) {return 'attachment';}
    if (is_singular()) {return get_post_type();}

    // if a custom query object was not passed, use $wp_query global
    if ( (!$object) || (!is_object($object)) ) {
        global $wp_query; $object = $wp_query;
    }
    if (!is_object($object)) {return '';} // should not fail

    // if the post_type query var has been explicitly set
    // (or implicitly set on the cpt via a has_archive redirect)
    // ie. this is true for is_post_type_archive at least
    // $vqueriedposttype = get_query_var('post_type'); // $wp_query only
    if (property_exists($object,'query_vars')) {
        $posttype = $object->query_vars['post_type'];
        if ($posttype) {return $posttype;}
    }

    // handle all other cases by looping posts in query object
    $posttypes = array();
    if (method_exists($object,'found_posts')) {
        if ($object->found_posts > 0) {
            $queriedposts = $object->posts;
            foreach ($queriedposts as $queriedpost) {
                $posttype = $queriedpost->post_type;
                if (!in_array($posttype,$posttypes)) {$posttypes[] = $posttype;}
            }
            if (count($posttypes == 1)) {return $posttypes[0];}
            else {return $posttypes;}
         }
     }
     return ''; // nothin to see here
}

Ciò restituirà in modo affidabile (l'ho detto?) Restituirà una matrice di tipi di post se ne è presente più di uno, oppure una stringa con il singolo tipo di post se esiste un solo tipo. Tutto quello che devi fare è:

$posttypes = get_current_post_types();
// or pass a post ID 
$posttypes = get_current_post_types($postid);
// or pass a post object
$posttypes = get_current_post_types($post);
// or pass a custom query - that has been run
$posttypes = get_current_post_types($query);

Esempio di utilizzo (solo per divertimento):

add_filter('the_posts','myplugin_fading_thumbnails',10,2);
function myplugin_fading_thumbnails($posts,$query) {
    if (!is_archive()) {return $posts;}
    $cptslug = 'myplugin_slug'; $dosomethingcool = false;
    $posttypes = get_current_post_types($query);
    if ( (is_array($posttypes)) && (in_array($cptslug,$posttypes)) ) {$dosomethingcool = true;}
    elseif ($cptslug == $posttypes) {$dosomethingcool = true;}

    if ($dosomethingcool) {
        global $fadingthumbnails; $fadingthumbnails = $cptslug;
        if (!has_action('wp_footer','myplugin_cpt_script')) {
            add_action('wp_footer','myplugin_cpt_script');
        }
    }

    function myplugin_cpt_script() {
        global $fadingthumbnails;
        echo "<script>var thumbnailclass = 'img.thumbtype-".$fadingthumbnails."';
        function fadeoutthumbnails() {jQuery(thumbnailclass).fadeOut(3000,fadeinthumbnails);}
        function fadeinthumbnails() {jQuery(thumbnailclass).fadeIn(3000,fadeoutthumbnails);}
        jQuery(document).ready(function() {fadeoutthumbnails();});
        </script>";
    }

    return $posts;
 }

Per vedere l'effetto, modifica il tipo di post personalizzato nel codice in poste aggiungi un thumbtype-postattributo di classe alle immagini in miniatura del post ...


0

Puoi usare questo codice:

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;

usa $ posttype_slug var qualunque cosa ti serva


deve $queried_object->query_var['post_type'];funzionare perché ...
Majick,

No. $ queried_object-> query_var containe solo una stringa di tipo post. non è oggetto o matrice. guarda questa immagine: prntscr.com/bd58e1
Guy Ytzhak,

ok ma solo se l'oggetto interrogato è sicuramente un oggetto di tipo post personalizzato, otterrai un diverso oggetto corrispondente e quindi un valore vuoto per le pagine di archivio categoria / tax / tag / author. anche perché ?post_type=postmi svuoto. confrontare conget_query_var('post_type');
Majick il

0

Puoi usare questo codice e questo codice funziona per me,

 $ t_slug = get_query_var ('term');

-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.