Tôi muốn biết nếu có thể lấy ID của một trang với một mẫu cụ thể. Có thể lấy ID của một trang được gán cho "page-Special.php" không?
Tôi muốn biết nếu có thể lấy ID của một trang với một mẫu cụ thể. Có thể lấy ID của một trang được gán cho "page-Special.php" không?
Câu trả lời:
Khi một trang được tạo, mẫu được gán cho trang đó được lưu dưới dạng meta bài đăng tùy chỉnh giống như các trường tùy chỉnh. Đây meta_key
là _wp_page_template
và meta_value
sẽ là mẫu trang
Bạn chỉ có thể sử dụng get_pages
để truy xuất tất cả các trang có một meta_value
mẫu được chỉ định
$pages = get_pages(array(
'meta_key' => '_wp_page_template',
'meta_value' => 'page-special.php'
));
foreach($pages as $page){
echo $page->ID.'<br />';
}
Nếu ai đó chỉ cần id trang, thì bạn sử dụng get_posts
và sau đó chỉ cần chuyển giá trị page
dưới dạng post_type
và ' as
ids`. Điều này sẽ đảm bảo truy vấn nhanh hơn, tối ưu hơn nhiều vì chúng tôi sẽ chỉ trả về cột id bài đăng trong db và không phải tất cả chúng cho các trang đã cho
( Yêu cầu 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>';
set_transient
( codex.wordpress.org/Transrons_API ) nếu bạn không muốn truy vấn cơ sở dữ liệu quá nhiều.
Nếu mẫu trang của bạn nằm trong thư mục con, thư mục chủ đề / trang mẫu / page-template.php thì truy vấn bên dưới của bạn sẽ hoạt động:
$page_details = get_pages( array(
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'hierarchical' => 0,
'meta_value' => 'page-templates/page-template.php'
));
Mã ở trên cũng hiển thị các trang phụ là tốt.
Cảm ơn
Sau đây là một kịch bản rõ ràng hơn một chút có tính đến một ngôn ngữ, nếu cần. LƯU Ý rằng nó giả định việc sử dụng Polylang, không phải WPML.
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
Đây là một chức năng hoàn chỉnh hoạt động với WPML và Polylang. Tín dụng vào https://github.com/cyrale/
/**
* Search for a page with a particular template.
*
* @param string $template Template filename.
* @param array $args (Optional) See also get_posts() for example parameter usage.
* @param bool $single (Optional) Whether to return a single value.
*
* @return Will be an array of WP_Post if $single is false. Will be a WP_Post object if the page is find, FALSE otherwise
*/
if (!function_exists('get_page_by_template')) {
function get_page_by_template($template, $args = array(), $single = true) {
$pages_by_template = wp_cache_get('pages_by_template', 'cyrale');
if (empty($pages_by_template) || !is_array($pages_by_template)) {
$pages_by_template = array();
}
if (!isset($pages_by_template[$template])) {
$args = wp_parse_args(array(
'posts_per_page' => -1,
'post_type' => 'page',
'suppress_filters' => 0,
'meta_query' => array(
array(
'key' => '_wp_page_template',
'value' => $template,
),
),
), $args);
$pages = get_posts($args);
$pages_by_template[$template]= array(
'single' => !empty($pages) && is_array($pages) ? reset($pages) : false,
'pages' => $pages,
);
}
wp_cache_set('pages_by_template', $pages_by_template, 'cyrale');
return $pages_by_template[$template][$single ? 'single' : 'pages'];
}
}