Meilleure façon de détecter si vous êtes dans une page SINGLE POST

9

Cela peut donc sembler une chose assez subalterne, mais suivez-moi ici.

J'essaie d'ajouter de la logique à l' pre_get_postsaction. C'est tout l'objet WP_Query qui m'a été donné. (voir la fin)

Choses que j'ai envisagées d'utiliser:

  • is_single() - trop large.
  • is_singular()- trop tôt pour l'utiliser, car il get_queried_object()n'est pas encore défini.
  • $query->single propriété - encore trop large.
  • $query->get('post_type')- non défini, car il utilise la namepropriété.

est namevraiment le seul indicateur ici?

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] => 
)
Eric Holmes
la source

Réponses:

10

J'ai déjà essayé de résoudre ce problème à mes propres fins. Autant que je sache ...

  • post_typen'est pas vraiment défini n'importe où pour le posttype de message.
  • Pour le pagetype de message, je ne vois que la clé du type de message queried_object.
  • Pour les types CPT, il y a une post_typeclé query_varset aussi query.
  • Les menus de navigation semblent se comporter comme les autres CPT à cet égard.

Les données sont très incohérentes mais si vous éliminez les pages et les CPT, je crois que vous pouvez en assumer le posttype.

Edit: Code de travail de @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. 
  } 
} 

Nous vérifions is_singular, aucun type poste (CPTs ont post_typeen query_vars), pas une page ou une pièce jointe.

s_ha_dum
la source
Et cela fonctionne à l'intérieur pre_get_posts(avant l'exécution de la requête)?
gmazzap
Je me demande si is_page()c'est réglé au pre_get_postsniveau. Si c'est le cas, et je peux vérifier qu'il post_typen'est pas défini dans query_vars, je suppose que c'est aussi bon que possible? Tellement cassé.
Eric Holmes
1
is_pagesemble être réglé.
s_ha_dum
@s_ha_dum J'ai supprimé le commentaire car il semble que cela ne fonctionne pas pour CPT ...
gmazzap
2
Ajout de la solution de travail à votre réponse.
Eric Holmes du
0

Je ne sais pas si cela sera 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 );

Utilisez $ wp_query-> posts (array) pour vérifier le type de publication.

ferényle
la source
Pas encore. La pré-publication des messages se produit avant que la $wp_query->postsvariable ne soit réellement remplie. Merci quand même!
Eric Holmes
0

Après quelques tests, je vois qu'il est malheureusement impossible d'obtenir le type de cpt à l'intérieur du pre_get_postscrochet. Seuls les is_pagetravaux mais pas le type de publication standard ni le cpt peuvent y être récupérés.

Si vous n'avez que la page et le post (pas de cpt), un chèque is_single()avec truecomme réponse signifie que le type de post est post, car il renvoie false pour les pages.

Si vous avez également des CPT, je crains que vous ne deviez effectuer une requête supplémentaire . Le plus simple que je puisse penser est d'obtenir la post_typecolonne où le statut du post est publier et le nom du post est celui requis (sauter les révisions):

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); 

Si vous souhaitez vérifier un type de publication spécifique, vous pouvez écrire une balise conditionnelle personnalisée qui compte simplement les lignes avec un post_type et un nom donnés:

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;
}

Bien sûr, cela est nécessaire pre_get_post, dans tout crochet ultérieur, vous pouvez utiliser get_post_type()...

gmazzap
la source
1
Cela fonctionnerait certainement, mais regardez dans la réponse acceptée, c'est une condition beaucoup moins compliquée, sans requête supplémentaire dans la base de données. :)
Eric Holmes
Oui. Je comprends que vous vouliez savoir exactement quel type de message montrez-vous. Non seulement si vous êtes dans une seule vue de publication. @EricHolmes
gmazzap
-1

C'est ce que j'utilise, bien qu'il soit spécialisé pour ma propre structure de répertoires.

/**
 * 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
                }
            }
        }
    }
}

Le kilométrage peut varier. Les bits strpos où je vérifie que les fichiers se trouvent dans un répertoire mais pas dans un autre devraient être modifiés pour votre build et pourraient probablement être re-factorisés plus efficacement. Ils existent pour découper les résultats au-dessus et au-dessous d'une certaine structure de répertoires.

L'exécution de la liste () dans le pied de page vous donnera une liste numérotée de chaque fichier de modèle .php utilisé pour compiler la vue actuelle. C'est particulièrement utile lorsque vous traitez un thème enfant qui rend un composant mystère.

Idées impératives
la source
Semble exagéré. Une bonne idée cependant?
Eric Holmes
Il n'y a pas beaucoup de bonnes façons de déterminer quels modèles génèrent une page, à part les analyser. Je suppose que si vous cherchez quelque chose d'aussi simple qu'une page unique, oui, c'est exagéré. Essayez cependant d'exécuter la fonction un certain temps, sans les conditions supplémentaires ignorées, et vous comprendrez pourquoi j'utilise ceci. Il existe une tonne de fichiers qui entrent dans la gestion d'une page WP et il peut être très utile de savoir ce qu'ils sont tous. Cependant, même cela n'identifiera pas les fonctions accrochées.
Imperative Ideas