Der beste Weg, um festzustellen, ob Sie sich auf einer SINGLE POST-Seite befinden

9

Das mag also eine ziemlich niedere Sache sein, aber folge mir hier.

Ich versuche, durch die pre_get_postsAktion etwas Logik hinzuzufügen . Dies ist das gesamte WP_Query-Objekt, das mir gegeben wurde. (siehe das Ende)

Dinge, die ich in Betracht gezogen habe:

  • is_single() - zu umfassend.
  • is_singular()- zu früh, um dies zu verwenden, da get_queried_object()noch nicht festgelegt.
  • $query->single Eigentum - wieder zu breit.
  • $query->get('post_type')- nicht festgelegt, da die nameEigenschaft verwendet wird.

ist hier namewirklich der einzige Indikator?

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
quelle

Antworten:

10

Ich habe versucht, dies für meine eigenen Zwecke zu klären. Soweit ich sagen kann ...

  • post_typeist für den postBeitragstyp nicht wirklich irgendwo eingestellt .
  • Für den pageBeitragstyp wird nur der Beitragstyp eingegeben queried_object.
  • Für CPT-Typen gibt es einen post_typeSchlüssel in query_varsund auch in query.
  • Navigationsmenüs scheinen sich in dieser Hinsicht wie andere CPTs zu verhalten.

Die Daten sind sehr inkonsistent, aber wenn Sie Seiten und CPTs entfernen, können Sie den postTyp annehmen .

Bearbeiten: Arbeitscode von @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. 
  } 
} 

Wir suchen nach is_singular, keinem Beitragstyp (CPTs haben post_typein query_vars), keiner Seite oder Anhang.

s_ha_dum
quelle
Und es funktioniert innen pre_get_posts(vor dem Ausführen der Abfrage)?
gmazzap
Ich frage mich, ob is_page()auf dem pre_get_postsNiveau eingestellt ist. Wenn dies der post_typeFall ist und ich prüfen kann, ob es nicht in query_vars festgelegt ist, ist das wohl so gut wie es nur geht? So gebrochen.
Eric Holmes
1
is_pagescheint gesetzt zu sein.
s_ha_dum
@s_ha_dum Ich habe den Kommentar entfernt, weil er für CPT anscheinend nicht funktioniert ...
gmazzap
2
Hinzufügen der funktionierenden Lösung zu Ihrer Antwort.
Eric Holmes
0

Ich weiß nicht, ob dies nützlich sein wird:

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

Verwenden Sie $ wp_query-> posts (Array), um den Beitragstyp zu überprüfen.

Ferenyl
quelle
Noch nicht. Pre-Get-Posts werden ausgeführt, bevor die $wp_query->postsVariable tatsächlich ausgefüllt wird. Trotzdem danke!
Eric Holmes
0

Nach einigen Tests sehe ich, dass es leider unmöglich ist, den Post-Typ von cpt in pre_get_postshook zu bekommen. Dort können nur is_pageWerke, aber weder Standardposttyp noch cpt abgerufen werden.

Wenn Sie nur Seite und Beitrag (kein Cpt) haben, bedeutet ein Häkchen is_single()mit trueals Antwort, dass der Beitragstyp Beitrag ist, da er für Seiten falsch zurückgibt.

Wenn Sie auch CPTs haben, müssen Sie leider eine zusätzliche Abfrage durchführen . Das einfachste, was ich mir post_typevorstellen kann, ist, einfach die Spalte abzurufen, in der der Post-Status veröffentlicht wird und post_name erforderlich ist (Überspringen von Revisionen):

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

Wenn Sie einen bestimmten Beitragstyp überprüfen möchten, können Sie ein benutzerdefiniertes bedingtes Tag schreiben, das nur die Zeilen mit einem bestimmten Beitragstyp und dem angegebenen Namen zählt:

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

Natürlich wird dies benötigt pre_get_post, in jedem späteren Haken können Sie get_post_type()...

gmazzap
quelle
1
Dies würde definitiv funktionieren, aber schauen Sie in die akzeptierte Antwort, es ist eine viel weniger komplizierte Bedingung, ohne eine zusätzliche Abfrage an die Datenbank. :)
Eric Holmes
Ja. Ich verstehe, dass Sie genau wissen wollten, welchen Beitragstyp Sie anzeigen. Nicht nur, wenn Sie sich in einer einzelnen Beitragsansicht befinden. @ EricHolmes
gmazzap
-1

Dies ist, was ich benutze, obwohl es auf meine eigene Verzeichnisstruktur spezialisiert ist.

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

Der Kilometerstand kann variieren. Die Strpos-Bits, in denen ich überprüfe, ob sich Dateien in einem Verzeichnis befinden, aber nicht in einem anderen, müssten für Ihren Build geändert werden und könnten wahrscheinlich effizienter umgerechnet werden. Sie existieren, um Ergebnisse über und unter einer bestimmten Verzeichnisstruktur auszuschneiden.

Wenn Sie die Liste () in der Fußzeile ausführen, erhalten Sie eine nummerierte Liste aller .php-Vorlagendateien, die zum Kompilieren der aktuellen Ansicht verwendet werden. Dies ist besonders nützlich, wenn Sie sich mit einem untergeordneten Thema befassen, das eine mysteriöse Komponente darstellt.

Imperative Ideen
quelle
Scheint übertrieben. Coole Idee?
Eric Holmes
Es gibt nicht viele gute Möglichkeiten, um festzustellen, welche Vorlagen eine Seite steuern, außer sie zu analysieren. Ich denke, wenn Sie nach etwas suchen, das so einfach ist wie Single vs Page, ja, es ist übertrieben. Versuchen Sie jedoch, die Funktion einige Zeit ohne die zusätzlichen Ignorierbedingungen auszuführen, und Sie werden sehen, warum ich diese verwende. Es gibt eine TONNE von Dateien, die zum Ausführen einer WP-Seite verwendet werden, und es kann sehr nützlich sein, zu wissen, was sie alle sind. Selbst dies identifiziert jedoch keine Hakenfunktionen.
Imperative Ideen