the_content ve is_main_query


15

İçeriği the_contentfiltreyle filtreliyorum. Değişikliklerimin özel sorgulara da uygulandığından, her şey mükemmel çalışıyor. Widget özel bir sorgu kullanıyorsa değişikliklerim kenar çubuğunda da görünüyor

Buna karşı, is_main_query()sadece ana sorguyu hedeflemek için kullanıyorum , ama çalışmıyor. Değişiklikler yine de tüm sorgulara tümüyle uygulanır. Ne komik olsa da, tüm diğer koşullu kontroller ister is_single()ve ister is_category()belirli sayfaları hedeflersem çalışır, ancak tüm değişiklikler ister kullansam is_main_query()da kullanmasam da , o sayfadaki diğer tüm özel sorguları etkiler

Burada bir şey mi eksik? Değişikliklerimi yalnızca the_contentfiltreyi kullanarak ana sorguya nasıl uygularım

add_filter('the_content', 'custom_content');

function custom_content($content){

    if(is_main_query()){ // << THIS IS NOT WORKING
        // My custom content that I add to the_content()    
    }
    return $content;
}

Yanıtlar:


11

Dürüst olmak gerekirse, işlev in_the_loop()aradığınız şeydir:

add_filter( 'the_content', 'custom_content' );

function custom_content( $content ) {
    if ( in_the_loop() ) {
        // My custom content that I add to the_content()    
    }
    return $content;
}

Ne in_the_loopyapar küresel olmadığını kontrol etmektir $wp_queryakım yazının (yani ana sorgu nesnedir) 'dir -1 < $current_post < $post_count.

Bu, ana sorgu döngü yaparken olur, çünkü döngü başlamadan önce geçerli yazı -1'dir ve döngü sona erdikten sonra geçerli yazı tekrar -1'e sıfırlanır.

Yani, in_the_loop()doğruysa, ana sorgu nesnesinin döngü yaptığı anlamına gelir, bu da bu durumda ihtiyacınız olan şeydir (ve @ialocin'in yazdığı gibi, eylemi ekleyip loop_startkaldırmanın aynı sonucudur loop_end; aslında işe yarıyor aynı nedenden dolayı ve + 1'imi aldım).

@ İalocin'in yaklaşımının yararı, in_the_loop()yalnızca ana sorgu için çalıştığı için ana nesneden farklı bir sorgu nesnesini hedeflemek istediğiniz zamandır .


Hiçbir site aramamda veya çevrimiçi aramada bununla karşılaşmadım. Çalışan gizli bir mücevher. Her çözüm kullanır is_main_query, gerçekten kimse bunu iyice test etmedi düşünüyorum. Girişiniz için teşekkür ederiz, gerçekten takdir ediyorum
Pieter Goosen

1
@PieterGoosen Çalışmasına sevindim. Bu çok eski bir işlev, doğrudan is_main_querybir şey olmadığı zamanlardan geliyor .
gmazzap

Gördüğünüz gibi, burada özledim, eski bir zamanlayıcı değilim :-), 3.3'te Wordpress'e katıldım.
Pieter Goosen

2
@ GM yanıtınıza eklemeyi düşünür müsünüz. Bu, bu yanıta rastlayabilecek başkaları için yararlı bilgilerdir. Çoğu insan, benim gibi, yorumları okumuyor :-)
Pieter Goosen

1
@PieterGoosen done :)
gmazzap

7

Bu sadece @ Otto'nun cevabına bir ektir. Sadece biraz daha iyi anlaşılır yapmak için. Temelde @Otto'nun söylediği mantığı tersine çevirmek zorundasınız, yani: ana sorguyu güvenilir bir şekilde belirleyebiliyorsanız, the_contentfiltreye bağlantınızı ekleyebilir ve kaldırabilirsiniz .

Örneğin, ana sorgu pre_get_postseylemde güvenilir bir şekilde tanınabilir , bu nedenle bu işe yarar:

function wpse162747_the_content_filter_callback( $content ) {
    return $content . 'with something appended';
}

add_action( 'pre_get_posts', 'wpse162747_pre_get_posts_callback' );
function wpse162747_pre_get_posts_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

Artık gerekli olmadığında filtreyi kaldırmanız gerektiğinden, loop_endeylemin bunun için iyi bir yer olması gerektiğini düşünüyorum ve onun muadili olarak kullanabiliriz loop_start. Bu şöyle görünecektir:

add_action( 'loop_start', 'wpse162747_loop_start_callback' );
function wpse162747_loop_start_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

add_action( 'loop_end', 'wpse162747_loop_end_callback' );
function wpse162747_loop_end_callback( $query ) {
    if ( $query->is_main_query() ) {
        remove_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

Bu yarıyı test edecek. Ayrıntılı açıklamanız için teşekkürler.
Pieter Goosen

Her zamanki gibi benim için zevk
Nicolai

1
Kısa bir kod the_content () içinde kullanılıyorsa ve kısa kod, the_content () öğesini çağıran, geçerli posta nesnesini sıfırlayan ve döngü devam eden başka bir sorgu başlatırsa ne olur? Tüm filtre uygulanacaktır. Oldukça zor, çan tarafından kaydedilmedi in_the_loop () ... Bu yüzden önerdiğim gibi, her zaman benzersiz filtreleri çıkarır kaldırmaz, @Nicolai tarafından yaklaştı
Jonas Lundman

5

is_main_query()Yanlış kullanıyorsunuz . Global $ wp_query değişkeni yeniden tanımlanmadıkça global is_main_query () işlevi true değerini döndürür.

Muhtemelen, bir the_content filtresinin içinde bulunduğunuz Döngünün ana sorgu olup olmadığını söylemenin% 100 güvenilir bir yolu yoktur. İçerik filtresi yalnızca içeriği filtreler. Hangi döngü için kullanıldığını bilmek için herhangi bir yeteneği yoktur.

Bunun yerine, filtrenizi ihtiyaç duyduğunuzda eklemeniz ve sonra ihtiyacınız olmadığında kaldırmanız gerekir.


Aslında, ana sorguyu the_contentfiltreyle hedeflemek için hızlı bir yolun olmaması bir hayal kırıklığıdır
Pieter Goosen

Peki, bu gerçekten şaşırtıcı değil. Diğer tüm filtreler gibi, sadece şeyleri filtreler. Ne zaman çağrıldığını çevreleyen bağlamı bilmiyor. Hatta uygun bir Döngü içinden çağırılamayabilir. Söylemenin yolu yok.
Otto
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.