WordPress tema geliştirmede oldukça yeniyim ve PHP (Java ve C # 'dan geldim) içine girmiyorum ve bu özel temada aşağıdaki duruma sahibim
Ana sayfada da görebileceğiniz gibi ilk olarak öne çıkan yazıları içeren bir bölümü ( evidenza'da Articoli olarak adlandırıyorum ) gösterdim (belirli bir etiketi kullanarak uyguladım) ve altında en son yayını içeren başka bir alan ( Ultimi Articoli adlı ) var öne çıkan yazı değil.
Bunu yapmak için bu kodu kullanın:
<section id="blog-posts">
<header class="header-sezione">
<h2>Articoli in evidenza</h2>
</header>
<!--<?php query_posts('tag=featured');?>-->
<?php
$featured = new WP_Query('tag=featured');
if ($featured->have_posts()) :
while ($featured->have_posts()) : $featured->the_post();
/*
* Include the post format-specific template for the content. If you want to
* use this in a child theme, then include a file called called content-___.php
* (where ___ is the post format) and that will be used instead.
*/
get_template_part('content', get_post_format());
endwhile;
wp_reset_postdata();
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
<header class="header-sezione">
<h2>Ultimi Articoli</h2>
</header>
<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
/*
* Include the post format-specific template for the content. If you want to
* use this in a child theme, then include a file called called content-___.php
* (where ___ is the post format) and that will be used instead.
*/
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
</section>
İyi çalışıyor, ancak bu çözümün kalitesi ve tam olarak nasıl çalıştığı hakkında bazı şüphelerim var.
Tüm özellikli yayınları seçmek için WP_Query
, belirli bir etikete sahip bir sorguyu tanımlayan yeni bir nesne oluşturan bu satırı kullanıyorum featured
:
$featured = new WP_Query('tag=featured');
Sonra have_posts()
yöntemini kullanarak bu sorgu sonucunu yineleme .
Yani, anladığım kadarıyla, bu WordPress ana sorgu değil, ama benim tarafımdan oluşturulan yeni bir sorgu. Anladığım kadarıyla, daha iyi yeni bir sorgu (bittiğinde) oluşturmak ve bu tür bir işlem gerçekleştirmek istediğinizde ana sorguyu kullanmak daha iyidir.
Doğru mu yoksa bir şey mi kaçırıyorum? Doğruysa, bana açıklayabilir misiniz, neden yeni bir özel sorgu oluşturmak ve Wordpress ana sorgusunu değiştirmemek daha iyidir?
Tamam, devam ediyor. 'Öne çıkan' etiketine sahip olmayan tüm yayınları gösteriyorum. Bunu yapmak için, tam tersine ana sorguyu değiştirir bu kod snippet'i kullanın:
<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
Bence bu oldukça korkunç. Bu doğru mu?
GÜNCELLEME:
Aynı işlemi yapmak için, function.php dosyasına eklediğim bu işlevi (aşağıdaki büyük cevapta) buldum.
function exclude_featured_tag( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
}
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );
Bu işlev, sorgu değişkeni nesnesi oluşturulduktan sonra, ancak gerçek sorgu çalıştırılmadan önce çağrılan bir kancaya sahiptir.
Yani, anladığım kadarıyla, giriş parametresi olarak bir sorgu nesnesi alır ve belirli bir etiket (benim durumumda featured
etiket mesajları) hariç tüm mesajları seçerek (aslında filtreler) değiştirir
Öyleyse, önceki sorguyu (özellikli yayınları göstermek için kullanılan sorgu) bu işlevle yalnızca temamdaki özellikli olmayan yayınları göstermek için nasıl kullanabilirim? Yoksa yeni bir sorgu oluşturmak zorunda mıyım?