TEK POST sayfasında olup olmadığınızı tespit etmenin en iyi yolu


9

Bu oldukça küçük bir şey gibi görünebilir, ama beni burada takip edin.

pre_get_postsEylem boyunca biraz mantık eklemeye çalışıyorum . Bu bana verilen tüm WP_Query nesnesidir. (sonuna bakın)

Kullanmayı düşündüğüm şeyler:

  • is_single() - çok geniş.
  • is_singular()- get_queried_object()henüz ayarlanmadığı için bunu kullanmak için çok erken .
  • $query->single özellik - yine çok geniş.
  • $query->get('post_type')- nameözelliği kullandığı için ayarlanmadı .

olduğu nametek göstergesi burada gerçekten?

WP_Query Object
(
    [query] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
        )

    [query_vars] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
            [error] => 
            [m] => 0
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [static] => 
            [pagename] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [paged] => 0
            [comments_popup] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [fields] => 
            [menu_order] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

        )

    [tax_query] => 
    [meta_query] => 
    [queried_object] => 
    [queried_object_id] => 0
    [post_count] => 0
    [current_post] => -1
    [in_the_loop] => 
    [comment_count] => 0
    [current_comment] => -1
    [found_posts] => 0
    [max_num_pages] => 0
    [max_num_comment_pages] => 0
    [is_single] => 1
    [is_preview] => 
    [is_page] => 
    [is_archive] => 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 
    [is_comments_popup] => 
    [is_paged] => 
    [is_admin] => 
    [is_attachment] => 
    [is_singular] => 1
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 
    [query_vars_hash] => f473ebf7f725c2627dc5fd9a1429f626
    [query_vars_changed] => 
    [thumbnails_cached] => 
)

Yanıtlar:


10

Bunu daha önce kendi amaçlarım için halletmeye çalıştım. Söyleyebildiğim kadarıyla ...

  • post_typegerçekten postyazı tipi için hiçbir yere ayarlanmamış .
  • İçin pageYayın türüne sadece post tip anahtarını bkz queried_object.
  • CPT tipleri post_typeiçin query_varsve içinde bir anahtar vardır query.
  • Gezinme menüleri bu açıdan diğer CPT'ler gibi davranıyor gibi görünüyor.

Veriler çok tutarsızdır, ancak sayfaları ve CPT'leri ortadan kaldırırsanız, posttürü kabul edebileceğinizi düşünüyorum .

Düzenleme: @EricHolmes çalışma kodu:

add_action( 'pre_get_posts', 'something_for_single_posts_only' ) ; 
function something_for_single_posts_only( $query ) { 
  if( $query->is_main_query() 
    && $query->is_singular() 
    && ! $query->get( 'post_type' ) 
    && ! $query->is_page() 
    && ! $query->is_attachment() 
  ) { 
      // do something for single posts only. 
  } 
} 

Biz is_singular, hiçbir Yayın türüne (NPT sahip olup olmadığını kontrol post_typeiçinde query_vars) değil, bir sayfanın veya eki.


Ve içinde çalışır pre_get_posts(sorgu çalıştırmadan önce)?
gmazzap

Seviyeye is_page()ayarlanıp ayarlanmadığını merak ediyorum pre_get_posts. Eğer öyleyse ve post_typequery_vars ayarlanmamasına karşı kontrol edebilirsiniz , sanırım o kadar iyi? Çok kırılmış.
Eric Holmes

1
is_pageayarlanmış gibi görünüyor.
s_ha_dum

@s_ha_dum CPT için çalışmıyor gibi gözüktüğü için yorumu kaldırdım ...
gmazzap

2
Cevabınıza çalışma çözümü eklemek.
Eric Holmes

0

Bunun yararlı olup olmayacağını bilmiyorum:

function hwl_home_pagesize( $query ) {
    global $wp_query;
    if (is_main_query() && count($wp_query->posts) < 2) {

    }

}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Gönderi türünü kontrol etmek için $ wp_query-> posts (dizi) kullanın.


Henüz değil. Ön alma mesajları, $wp_query->postsdeğişken gerçekten doldurulmadan önce gerçekleşir . Yine de teşekkürler!
Eric Holmes

0

Bazı testlerden sonra maalesef pre_get_postskanca içinde cpt sonrası tip almak için ne yazık ki mümkün olmadığını görüyorum . Sadece is_pageçalışır ancak standart yazı tipi veya cpt alınamaz.

Eğer sadece sayfasını ve yazı (hayır cpT) bir çek varsa is_single()ile truetepki aracı olarak bu sayfaları için return false çünkü sonrası tipi, post olduğunu.

Ayrıca CPT'leriniz varsa, korkarım ek bir sorgu gerçekleştirmeniz gerekir . Düşünebildiğim en basit, sadece post_typeyazı durumunun yayınlandığı ve posta_adı gerekli olan sütunu elde etmektir (revizyonları atlamak):

function test( $q ) {
  if ( is_single() ) {
    global $wpdb;
    $type = $wpdb->get_var( $wpdb->prepare(
      "SELECT post_type FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type <> 'revision'",
      $q->query['name']
    ) );
    var_dump($type);
  }
}
add_action( 'pre_get_posts', 'test', 1); 

Belirli bir gönderi türünü kontrol etmek istiyorsanız, yalnızca belirli bir post_type ve verilen adla satırları sayan özel bir koşullu etiket yazabilirsiniz:

function is_single_post_type( $type = 'post' ) {
  if ( is_single() ) {
    global $wpdb, $wp_query;
    $is = $wpdb->get_var( $wpdb->prepare(
      "SELECT count(ID) FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type = %s",
      $wp_query->query['name'], $type
    ) );
    return $is > 0;
  }
  return false;
}

Tabii ki bu gerekli, pre_get_postdaha sonraki kancalarda kullanabilirsiniz get_post_type()...


1
Bu kesinlikle işe yarayacaktır, ancak kabul edilen cevaba bakın, veritabanına ek bir sorgu yapmadan çok daha az karmaşık bir koşullu. :)
Eric Holmes

Evet. Tam olarak hangi yazı türünü gösterdiğini bilmek istediğini anlıyorum. Yalnızca tek bir gönderi görünümündeyseniz değil. @EricHolmes
gmazzap

-1

Bu benim kendi dizin yapısı için uzmanlaşmış olsa ben kullanıyorum.

/**
 * Function to list all templates used in a page
 * @author Imperative Ideas with thanks to Rarst
 * @uri http://wordpress.stackexchange.com/a/89005
 */

function thelist() {
    $included_files = get_included_files();
    $stylesheet_dir = str_replace( '\\', '/', get_stylesheet_directory() );
    $template_dir   = str_replace( '\\', '/', get_template_directory() );
    echo '<h3 class="debugtitle">Theme file templates used in this page</h3>';
    foreach ( $included_files as $key => $path ) {

        $path   = str_replace( '\\', '/', $path );

        if ( false === strpos( $path, $stylesheet_dir ) && false === strpos( $path, $template_dir ) )
            unset( $included_files[$key] );

        if(!strpos($path, '/wp-content/themes/') === false) { // Files IN this directory
            if(strpos($path, '/library/') === false) { // Ignore this subdir
                if(strpos($path, '/hybrid-core/') === false) { // Ignore this subdir
                    echo $key." = ". $path."</br>"; // Finally, output the list
                }
            }
        }
    }
}

Kilometre değişebilir. Dosyaların bir dizinde olup olmadığını kontrol etmek için strpos bitleri, derlemeniz için başka bir modifiye edilmemeli ve muhtemelen daha verimli bir şekilde yeniden faktörlendirilebilir. Belirli bir dizin yapısının üstündeki ve altındaki sonuçları kesmek için varlar.

Altbilgide thelist () çalıştırmak, geçerli görünümü derlemek için kullanılan her .php şablon dosyasının numaralı bir listesini verir. Özellikle gizemli bir bileşen oluşturan bir çocuk temasıyla uğraşırken kullanışlıdır.


Aşırı gibi görünüyor. Harika bir fikir olsa?
Eric Holmes

Hangi şablonların bir sayfayı yönlendirdiğini belirlemenin, onları ayrıştırmak yerine pek çok iyi yolu yoktur. Sanırım single vs page kadar basit bir şey arıyorsanız, evet, bu aşırıya kaçmış. Yine de işlevi bir süreliğine çalıştırmayı deneyin, ekstra eksi koşullarını yok sayın ve bunu neden kullandığımı göreceksiniz. Bir WP sayfasını süren bir TON dosyası var ve hepsinin ne olduğunu bilmek gerçekten yararlı olabilir. Bu bile bağlanmış fonksiyonları tanımlamayacaktır.
Emir Fikirleri
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.