Jestem całkiem nowy w tworzeniu motywów WordPress i nie przepadam za PHP (pochodzę z Java i C #) i mam następującą sytuację w tym niestandardowym motywie
Jak widać na stronie głównej, najpierw pokazuję sekcję (o nazwie Articoli in evidenza ) zawierającą polecane posty (zaimplementowałem ją za pomocą określonego tagu), a pod nią jest inny obszar (o nazwie Ultimi Articoli ), który zawiera najnowszy post które nie są polecanym postem.
Aby to zrobić, używam tego kodu:
<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>
Działa dobrze, ale mam wątpliwości co do jakości tego rozwiązania i jego dokładnego działania.
Aby wybrać wszystkie polecane posty , używam tego wiersza, który tworzy nowy WP_Query
obiekt, który definiuje zapytanie posiadające określony znacznik featured
:
$featured = new WP_Query('tag=featured');
Następnie iteruję wynik tego zapytania, używając jego have_posts()
metody.
Z tego, co rozumiem, nie jest to główne zapytanie WordPress, ale nowe zapytanie utworzone przeze mnie. Z tego, co rozumiem, lepiej utworzyć nowe zapytanie (tak jak zostało wykonane) i nie używać głównego zapytania, gdy chcę wykonać tego rodzaju operację.
Czy to prawda, czy coś mi brakuje? Jeśli to prawda, czy możesz mi wyjaśnić, dlaczego lepiej jest utworzyć nowe niestandardowe zapytanie, a nie modyfikować głównego zapytania Wordpress?
Okej, idziemy dalej. Pokazuję wszystkie posty, które nie mają tagu „polecany”. Aby to zrobić, używam tego fragmentu kodu, który przeciwnie, modyfikuje główne zapytanie:
<?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;
?>
Myślę więc, że to jest okropne. Czy to prawda?
AKTUALIZACJA:
Aby wykonać tę samą operację, znalazłem tę funkcję (w świetnej odpowiedzi poniżej), którą dodałem do functions.php
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' );
Ta funkcja ma zaczep, który jest wywoływany po utworzeniu obiektu zmiennej zapytania, ale przed uruchomieniem rzeczywistego zapytania.
Tak więc, z tego co zrozumiałem, pobiera obiekt zapytania jako parametr wejściowy i modyfikuje go (faktycznie filtruje), wybierając wszystkie posty z wyłączeniem określonego znacznika (w moim przypadku featured
posty znaczników)
Jak więc użyć poprzedniej kwerendy (tej używanej do wyświetlania polecanych postów) z tą funkcją, aby wyświetlać tylko nie polecane posty w moim motywie? Czy muszę utworzyć nowe zapytanie?
źródło