Nhận id trang theo mẫu


19

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:


39

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_wp_page_templatemeta_valuesẽ 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_valuemẫ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 />';
}

EDIT 23-07-2015

Nếu ai đó chỉ cần id trang, thì bạn sử dụng get_postsvà sau đó chỉ cần chuyển giá trị pagedưới dạng post_typevà ' asids`. Đ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>';

Này cảm ơn nhé. Không phải là một chút quá "nặng"? (chạy qua tất cả các trang)
user3800799

Phụ thuộc vào số lượng trang bạn có. Thực tế không có cách bản địa nào nhanh hơn mà tôi biết để lấy dữ liệu này. Nếu bạn có nhiều trang, tôi khuyên bạn nên sử dụng tạm thời để lưu trữ dữ liệu đó và chỉ xóa / xóa tạm thời khi một trang mới được xuất bản
Pieter Goosen

Niềm vui của tôi, vui mừng tôi có thể giúp đỡ. Thưởng thức :-)
Pieter Goosen

@ user3800799 Tôi đã cập nhật bài đăng nếu bạn chỉ quan tâm đến việc lấy id, không có gì khác
Pieter Goosen

Bạn cũng có thể sử dụng 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.
Chris Andersson

2

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


0

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

0

Đâ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'];
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.