Il modo migliore per rilevare se ci si trova in una pagina POST SINGOLA


9

Quindi può sembrare una cosa piuttosto umile, ma seguimi qui.

Sto cercando di aggiungere un po 'di logica attraverso l' pre_get_postsazione. Questo è l'intero oggetto WP_Query che mi è stato dato. (vedi la fine)

Cose che ho considerato usando:

  • is_single() - troppo ampio.
  • is_singular()- troppo presto per usarlo, poiché get_queried_object()non è ancora impostato.
  • $query->single proprietà - di nuovo troppo ampia.
  • $query->get('post_type')- non impostato, in quanto utilizza la nameproprietà

è namedavvero l'unico indicatore qui?

WP_Query Object
(
    [query] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
        )

    [query_vars] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
            [error] => 
            [m] => 0
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [static] => 
            [pagename] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [paged] => 0
            [comments_popup] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [fields] => 
            [menu_order] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

        )

    [tax_query] => 
    [meta_query] => 
    [queried_object] => 
    [queried_object_id] => 0
    [post_count] => 0
    [current_post] => -1
    [in_the_loop] => 
    [comment_count] => 0
    [current_comment] => -1
    [found_posts] => 0
    [max_num_pages] => 0
    [max_num_comment_pages] => 0
    [is_single] => 1
    [is_preview] => 
    [is_page] => 
    [is_archive] => 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 
    [is_comments_popup] => 
    [is_paged] => 
    [is_admin] => 
    [is_attachment] => 
    [is_singular] => 1
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 
    [query_vars_hash] => f473ebf7f725c2627dc5fd9a1429f626
    [query_vars_changed] => 
    [thumbnails_cached] => 
)

Risposte:


10

Ho provato a risolverlo prima per i miei scopi. Per quanto posso dire ...

  • post_typenon è impostato in alcun modo per il posttipo di post.
  • Per il pagetipo di post vedo solo la chiave del tipo di post queried_object.
  • Per i tipi CPT c'è una post_typechiave dentro query_varse anche dentro query.
  • I menu di navigazione sembrano comportarsi come gli altri CPT in questo senso.

I dati sono molto incoerenti ma se si eliminano pagine e CPT credo che si possa assumere il posttipo.

Modifica: codice funzionante da @EricHolmes:

add_action( 'pre_get_posts', 'something_for_single_posts_only' ) ; 
function something_for_single_posts_only( $query ) { 
  if( $query->is_main_query() 
    && $query->is_singular() 
    && ! $query->get( 'post_type' ) 
    && ! $query->is_page() 
    && ! $query->is_attachment() 
  ) { 
      // do something for single posts only. 
  } 
} 

Controlliamo per is_singular, nessun tipo messaggio (CPT hanno post_typea query_vars), non è una pagina o un allegato.


E funziona all'interno pre_get_posts(prima dell'esecuzione della query)?
gmazzap

Mi chiedo se is_page()è impostato a pre_get_postslivello. Se lo è, e posso verificare di post_typenon essere impostato in query_vars, immagino che sia buono come può? Così rotto.
Eric Holmes,

1
is_pagesembra essere impostato.
s_ha_dum,

@s_ha_dum Ho rimosso il commento perché sembra non funzionare per CPT ...
gmazzap

2
Aggiunta della soluzione di lavoro alla tua risposta.
Eric Holmes,

0

Non so se questo sarà utile:

function hwl_home_pagesize( $query ) {
    global $wp_query;
    if (is_main_query() && count($wp_query->posts) < 2) {

    }

}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Usa $ wp_query-> posts (array) per controllare il tipo di post.


Non ancora. I post pre get vengono visualizzati prima che la $wp_query->postsvariabile venga effettivamente popolata. Grazie comunque!
Eric Holmes,

0

Dopo alcuni test vedo che sfortunatamente è impossibile ottenere il tipo di post cpt all'interno del pre_get_postsgancio. Qui is_pagefunziona solo il tipo di posta standard, ma non il cpt.

Se hai solo pagina e posta (no cpt) un segno di spunta is_single()con truecome risposta significa che il tipo di post è post, perché restituisce false per le pagine.

Se hai anche CPT, temo che devi eseguire una query aggiuntiva . Il più semplice che posso pensare è solo ottenere la post_typecolonna in cui lo stato dei post è pubblicato e post_name è quello richiesto (saltando le revisioni):

function test( $q ) {
  if ( is_single() ) {
    global $wpdb;
    $type = $wpdb->get_var( $wpdb->prepare(
      "SELECT post_type FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type <> 'revision'",
      $q->query['name']
    ) );
    var_dump($type);
  }
}
add_action( 'pre_get_posts', 'test', 1); 

Se si desidera controllare un tipo di post specifico, è possibile scrivere un tag condizionale personalizzato che conti solo le righe con un dato post_type e il nome dato:

function is_single_post_type( $type = 'post' ) {
  if ( is_single() ) {
    global $wpdb, $wp_query;
    $is = $wpdb->get_var( $wpdb->prepare(
      "SELECT count(ID) FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type = %s",
      $wp_query->query['name'], $type
    ) );
    return $is > 0;
  }
  return false;
}

Naturalmente questo è necessario pre_get_post, in qualsiasi gancio successivo puoi usare get_post_type()...


1
Funzionerebbe sicuramente, ma guarda nella risposta accettata, è un condizionale molto meno complicato, senza una query aggiuntiva al database. :)
Eric Holmes,

Sì. Comprendo che volevi sapere esattamente quale tipo di post stai mostrando. Non solo se ti trovi in ​​una vista a post singolo. @EricHolmes
gmazzap

-1

Questo è quello che sto usando, sebbene sia specializzato per la mia struttura di directory.

/**
 * Function to list all templates used in a page
 * @author Imperative Ideas with thanks to Rarst
 * @uri http://wordpress.stackexchange.com/a/89005
 */

function thelist() {
    $included_files = get_included_files();
    $stylesheet_dir = str_replace( '\\', '/', get_stylesheet_directory() );
    $template_dir   = str_replace( '\\', '/', get_template_directory() );
    echo '<h3 class="debugtitle">Theme file templates used in this page</h3>';
    foreach ( $included_files as $key => $path ) {

        $path   = str_replace( '\\', '/', $path );

        if ( false === strpos( $path, $stylesheet_dir ) && false === strpos( $path, $template_dir ) )
            unset( $included_files[$key] );

        if(!strpos($path, '/wp-content/themes/') === false) { // Files IN this directory
            if(strpos($path, '/library/') === false) { // Ignore this subdir
                if(strpos($path, '/hybrid-core/') === false) { // Ignore this subdir
                    echo $key." = ". $path."</br>"; // Finally, output the list
                }
            }
        }
    }
}

Il chilometraggio può variare. I bit strpos in cui controllo che i file si trovino in una directory ma non in un'altra dovrebbero essere modificati per la tua build e probabilmente potrebbero essere ricodificati in modo più efficiente. Esistono per tagliare i risultati sopra e sotto una certa struttura di directory.

L'esecuzione dell'elenco () nel piè di pagina fornisce un elenco numerato di ogni file modello .php utilizzato per compilare la vista corrente. È particolarmente utile quando si ha a che fare con un tema figlio che sta rappresentando una componente misteriosa.


Sembra eccessivo. Bella idea però?
Eric Holmes,

Non ci sono molti buoni modi per determinare quali modelli stanno guidando una pagina, oltre a analizzarli. Immagino che se stai cercando qualcosa di semplice come una singola pagina, sì, è eccessivo. Prova a eseguire la funzione un po 'di tempo, meno i condizionali extra ignora e vedrai perché lo uso. Ci sono un sacco di file che vanno alla guida di una pagina WP e può essere davvero utile sapere cosa sono tutti. Anche questo non identificherà le funzioni agganciate però.
Idee imperative
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.