特定のテンプレートを持つページのIDを取得することが可能かどうかを知りたいです。 "page-special.php"に割り当てられているページのIDを取得することは可能ですか?
ページが作成されると、そのページに割り当てられたテンプレートは、カスタム項目と同じ方法でカスタム投稿メタとして保存されます。 meta_key
は_wp_page_template
で、meta_value
はページテンプレートになります
指定したテンプレートのget_pages
を持つすべてのページを取得するには、 meta_value
を使用するだけです。
$pages = get_pages(array(
'meta_key' => '_wp_page_template',
'meta_value' => 'page-special.php'
));
foreach($pages as $page){
echo $page->ID.'<br />';
}
ページIDだけが必要な場合は、get_posts
を使用してからpage
をpost_type
および 'idsas
fields`の値として渡します。指定されたページのすべてではなく、db内のpost id列のみが返されるため、これにより、はるかに高速ではるかに最適化されたクエリが保証されます。
( PHP 5.4+ が必要)
$args = [
'post_type' => 'page',
'fields' => 'ids',
'nopaging' => true,
'meta_key' => '_wp_page_template',
'meta_value' => 'page-special.php'
];
$pages = get_posts( $args );
foreach ( $pages as $page )
echo $page . '</br>';
あなたのページテンプレートがサブフォルダ、theme-folder/page-templates/page-template.phpの中にあるなら、あなたは以下の質問をするでしょう:
$page_details = get_pages( array(
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'hierarchical' => 0,
'meta_value' => 'page-templates/page-template.php'
));
上記のコードはサブページも表示します。
ありがとう
以下は、必要に応じて言語を考慮に入れた、もう少し明確なスクリプトです。 WPMLではなくPolylangの使用を想定していることに注意してください。
function get_post_id_by_template($template,$lang_slug = null){
global $wpdb;
$wh = ($lang_slug) ? " AND t.slug = %s" : "";
$query = $wpdb->prepare(
"SELECT DISTINCT p.ID
FROM $wpdb->posts p
INNER JOIN $wpdb->postmeta meta ON meta.post_id = p.ID
INNER JOIN $wpdb->term_relationships tr ON meta.post_id = tr.object_id
INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN $wpdb->terms t ON tt.term_id = t.term_id
WHERE p.post_status = 'publish' AND meta.meta_key = %s AND meta.meta_value = %s" . $wh,
'_wp_page_template',
$template,
$lang_slug
);
$ids = $wpdb->get_results($query);
if($ids && isset($ids[0])){
$p = $ids[0];
return $p->ID;
} else {
return false;
}
}// get_post_id_by_template