Sayfa kimliğini şablona göre al


19

Belirli bir şablonla bir sayfanın kimliğini almanın mümkün olup olmadığını bilmek istiyorum. "Page-special.php" dosyasına atanan bir sayfanın kimliğini almak mümkün mü?

Yanıtlar:


39

Bir sayfa oluşturulduğunda, o sayfaya atanan şablon, özel alanlarla aynı şekilde özel gönderi meta olarak kaydedilir. meta_keyOlduğu _wp_page_templateve meta_valuesayfa şablonu olacaktır

Sadece yararlanabilirler get_pagesbir olan tüm sayfalarını için meta_valuebelirlenmiş bir şablon

$pages = get_pages(array(
    'meta_key' => '_wp_page_template',
    'meta_value' => 'page-special.php'
));
foreach($pages as $page){
    echo $page->ID.'<br />';
}

23-07-2015 DÜZENLEME

Biri sadece sayfa kimlikleri ihtiyacı varsa, o zaman faydalanmak get_postsve daha sonra sadece geçmektedir pageolarak post_typekimlikleri' ve asfields` değerini. Bu, çok daha hızlı ve çok daha optimize bir sorgu sağlayacaktır çünkü yalnızca db'deki posta kimliği sütununu döndüreceğiz ve bunların tümünü verilen sayfalar için döndürmeyeceğiz

( PHP 5.4+ gerektirir )

$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>';

Hey teşekkürler. Biraz fazla "ağır" değil mi? (tüm sayfalarda yayınlanıyor)
user3800799

Kaç sayfanız olduğuna bağlıdır. Aslında bu verileri almak için bildiğim daha hızlı yerel bir yol yoktur. Çok fazla sayfanız varsa, bu verileri saklamak için geçici olanlardan yararlanmanızı ve yalnızca yeni bir sayfa yayınlandığında geçici olanları yıkamanızı / silmenizi öneririm
Pieter Goosen

Benim için bir zevkti. Keyfini çıkarın :-)
Pieter Goosen

@ user3800799 Sadece kimlikleri almakla ilgileniyorsanız yayını güncelledim, başka bir şey yok
Pieter Goosen

Veritabanını çok fazla sorgulamak istemiyorsanız set_transient( codex.wordpress.org/Transients_API ) öğesini de kullanabilirsiniz .
Chris Andersson

2

Sayfa şablonunuz alt klasörde bulunuyorsa, theme-folder / page-templates / page-template.php sorgusunun altında çalışacaksınız:

$page_details = get_pages( array(
 'post_type' => 'page',
 'meta_key' => '_wp_page_template',
 'hierarchical' => 0,
 'meta_value' => 'page-templates/page-template.php'
));

Yukarıdaki kodlar alt sayfaları da gösterir.

Teşekkürler


0

Aşağıda, gerekirse bir dili dikkate alan biraz daha eklemli bir komut dosyası verilmiştir. WPML yerine Polylang kullanımını üstlendiğini unutmayın.

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

İşte WPML ve Polylang ile çalışan tam bir işlev. Kredi 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'];
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.