web-dev-qa-db-ja.com

ループ内でページIDを取得する

ブログ記事を表示するためのループを含むページテンプレートがあります。ループ内には、ブログ投稿のコンテンツを表示するテンプレート(content-custom.php)を含めるためのget_template_part('content', 'custom')関数があります。 content-custom.phpファイル内に現在のページIDを取得することは可能ですか?

1

このファイル内では templateタグ をすべて使用できます。そのため、IDを取得するには、 get_the_ID() (または the_ID() を使用して出力する)だけを使用します。

get_the_ID()は現在の投稿の数値IDを取得します。パラメータはなく、現在の投稿のIDを返します。

the_ID()は現在の投稿のID番号を表示します。パラメータもありません。

カスタムループを含むページのIDにアクセスしたい場合は、次のようにします。

解決策1(単純ですが、グローバル変数を使用した場合はあまりよくありません)

あなたのページテンプレートで:

<?php
    global $parent_page_id;
    $parent_page_id = get_the_ID();
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args = array( 'post_type' => 'post', 'paged' => $paged );
    $temp = $wp_query;
    $wp_query = null;
    $wp_query = new WP_Query( $args );
    $wp_query->query( $args );
?>

<?php if ( $wp_query->have_posts() ) : ?>
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php get_template_part( 'content', 'custom' ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

<?php else : ?>
    <?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>

そしてあなたのポストコンテンツテンプレートの中で:

...
global $parent_page_id; // now you can use parent_page_template variable
...

解決策2(カスタムクエリによるより良い方法)

あなたのページテンプレートで:

<?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args = array( 'post_type' => 'post', 'paged' => $paged );
    $my_custom_query = new WP_Query( $args );
?>

<?php if ( $my_custom_query->have_posts() ) : ?>
    <?php while ( $my_custom_query->have_posts() ) : $my_custom_query->the_post(); ?>
    <?php get_template_part( 'content', 'custom' ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

<?php else : ?>
    <?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>

そしてあなたのポストコンテンツテンプレートの中で:

...
... $wp_query->queried_object_id; // it will contain object queried in original wp_query
...
2

Per この答え /あなたは get_queried_object_id() を使うことができました。これはまだCodexにはありませんが、 get_queried_object() に関連しています。

$page_id = get_queried_object_id();
8
helgatheviking

ページIDを取得するには、グローバル投稿を使用できます。

 
 global $ post; 
 echo "pageid:"。$ post-> ID; 
 

上記では投稿IDではなく現在のページIDを取得します。

1
shahpranaf

解決策1: (悪い解決策)

$p = $GLOBALS['wp_the_query']->get_queried_object_id(); 
//$p will be your page id

注:グローバルなwp_the_queryオブジェクトを使用しないでください。

編集: もしあなたがグローバルなwp_queryオブジェクトを改ざんしていなければ、すなわちquery_posts()などを使っていなければ、helgathevikingの解決策はうまくいくでしょう。

 get_queried_object_id(); 
or 
$GLOBAL['wp_query']->get_queried_object_id();

解決策2: コメントで提案されているpassatgtのように、ループの外側にページIDを格納し、ループの内側にアクセスすることができます。テンプレートパーツファイルでそれにアクセスすることのスコープの問題は、それをグローバルに宣言することによって解決できます。

コード:

//1. in the template file befor the loop 

global $myglobal_page_id;
$mygloba_page_id = get_the_ID();
//you can start the loop here
get_template_part('content', 'custom');

// 2. in the template part file 

global $myglobal_page_id; //inside the loop or otherwise

//this will have your page_id

説明#解決策1:

ループ内に入ると、グローバル投稿オブジェクトは現在の投稿に設定されます。したがって、あなたがthe_ID()、get_the_ID()(これはget_post()関数を使用した)を呼び出すと、メインの投稿ではなく現在の投稿のIDを取得します。

そのため、元のクエリが含まれているため、メインのwp_the_queryオブジェクト(クエリref:wp_reset_query()のリセットに使用されるメインのクエリオブジェクトのコピー)にアクセスする必要があります。

0
MortalViews