SINGLE POSTページにいるかどうかを検出する最良の方法


9

だからこれはかなり平凡なことのように見えるかもしれませんが、ここで私に従ってください。

pre_get_postsアクションを通じてロジックを追加しようとしています。これは私に与えられたWP_Queryオブジェクト全体です。(終わりを参照)

私が使用を検討したもの:

  • is_single() - 広すぎます。
  • is_singular()- get_queried_object()まだ設定されていないため、これを使用するには早すぎます。
  • $query->single プロパティ-広すぎる。
  • $query->get('post_type')- nameプロパティを使用しているため、設定されていません。

あるname本当にここだけのインジケータ?

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] => 
)

回答:


10

私はこれを自分の目的のために以前に整理しようとしました。私の知る限り ...

  • post_type実際にはpost投稿タイプのどこにも設定されていません。
  • page投稿タイプの場合、投稿タイプキーのみが表示され queried_objectます。
  • CPTタイプの場合post_typequery_varsおよびにもキーがあり queryます。
  • この点で、ナビゲーションメニューは他のCPTと同様に動作するように見えます。

データは非常に一貫していませんが、ページとCPTを削除すると、postタイプを推測できると思います。

編集:@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. 
  } 
} 

is_singular、ページまたは添付ファイルではなく、投稿タイプ(CPTはpost_typeにあるquery_vars)がないかチェックします。


そしてそれはpre_get_posts(クエリ実行前に)内部で動作しますか?
gmazzap

場合、私は疑問is_page()に設定されているpre_get_postsレベル。そうであり、post_typequery_varsに設定されていないことを確認できる場合、それはそれで十分だと思いますか?とても壊れた。
エリックホームズ

1
is_page設定されているようです。
s_ha_dum 2013年

@s_ha_dum CPTでは機能しないようなので、コメントを削除しました...
gmazzap

2
あなたの答えに実用的なソリューションを追加します。
エリックホームズ

0

これが役立つかどうかわかりません:

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

$ wp_query-> posts(配列)を使用して、投稿タイプを確認します。


未だに。事前取得投稿は、$wp_query->posts変数が実際に入力される前に発生します。ありがとう!
エリックホームズ

0

いくつかのテストの後、残念ながらポストタイプのcpt inside pre_get_postsフックを取得することは不可能であることがわかりました。唯一のis_page作品ではなく、標準ポストタイプもCPTが取得することができます。

あなたが唯一のページとポスト(なしCPT)のチェックをしている場合is_single()true、応答手段として、それはページのfalseを返すので、ポストタイプは、ポストであること。

CPTもある場合は、追加のクエリを実行する必要があります。私が考えることができる最も単純なことはpost_type、投稿ステータスが公開であり、post_nameが必要なものである列を取得することです(リビジョンをスキップします):

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

特定の投稿タイプを確認する場合は、特定のpost_typeと特定の名前を持つ行を数えるだけのカスタム条件タグを作成できます。

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

もちろん、これはで必要です。pre_get_postそれ以降のフックでは、使用できますget_post_type()...


1
これは間違いなく機能しますが、受け入れられた答えを見てください。データベースへの追加のクエリがなければ、はるかに複雑な条件ではありません。:)
Eric Holmes

はい。表示している投稿の種類を正確に知りたいとのことでした。単一の投稿ビューにいる場合だけではありません。@EricHolmes
gmazzap

-1

これは私が使用しているものですが、自分のディレクトリ構造に特化しています。

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

走行距離は異なる場合があります。ファイルが1つのディレクトリにあるが別のディレクトリにはないことを確認するstrposビットは、ビルド用に変更する必要があり、おそらくより効率的にリファクタリングできます。特定のディレクトリ構造の上下に結果を切り出すために存在します。

フッターでthelist()を実行すると、現在のビューのコンパイルに使用されるすべての.phpテンプレートファイルの番号付きリストが表示されます。ミステリーコンポーネントをレンダリングする子テーマを処理するときに特に役立ちます。


やり過ぎのようです。でもクールなアイデア?
Eric Holmes

テンプレートを解析する以外に、どのテンプレートがページを動かしているのかを判断する良い方法はたくさんありません。単一のページと同じくらい単純なものを探しているなら、そうです、それはやり過ぎです。しばらく関数を実行してみて、余分な無視条件を除いてみてください。これを使用する理由がわかります。WPページの駆動に入るファイルのトンがあります、そしてそれらすべてが何であるかを知ることは本当に役に立ちます。これでもフックされた関数は識別されません。
命令的アイデア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.