Tôi khá mới trong phát triển chủ đề WordPress và tôi không thích PHP (tôi đến từ Java và C #) và có tình huống sau trong chủ đề tùy chỉnh này
Như bạn có thể thấy trong trang chủ, lần đầu tiên tôi hiển thị một phần (có tên là Articoli trong evidenza ) có chứa các bài đăng nổi bật (tôi đã triển khai nó bằng một thẻ cụ thể) và bên dưới nó có một khu vực khác (có tên là Ultimi Articoli ) có chứa bài đăng mới nhất đó không phải là bài viết nổi bật.
Để làm điều đó tôi sử dụng mã này:
<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>
Nó hoạt động tốt, nhưng tôi có một số nghi ngờ về chất lượng của giải pháp này và cách chính xác nó hoạt động.
Để chọn tất cả các bài đăng nổi bật , tôi sử dụng dòng này tạo một WP_Query
đối tượng mới xác định truy vấn có thẻ cụ thể featured
:
$featured = new WP_Query('tag=featured');
Sau đó, tôi lặp lại kết quả truy vấn này bằng have_posts()
phương pháp của nó .
Vì vậy, từ những gì tôi đã hiểu, đây không phải là truy vấn chính của WordPress, nhưng nó là một truy vấn mới do tôi tạo ra. Từ những gì tôi hiểu, tốt hơn là tạo một truy vấn mới (như đã hoàn thành) và không sử dụng truy vấn chính khi tôi muốn thực hiện loại hoạt động này.
Là sự thật, hay tôi đang thiếu một cái gì đó? Nếu đó là sự thật, bạn có thể giải thích cho tôi, tại sao tốt hơn là tạo một truy vấn tùy chỉnh mới và không sửa đổi truy vấn chính Wordpress?
Ok, đang diễn ra. Tôi hiển thị tất cả các bài đăng không có thẻ 'đặc trưng'. Để làm điều này, tôi sử dụng đoạn mã này, ngược lại, sửa đổi truy vấn chính:
<?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;
?>
Vì vậy, tôi nghĩ rằng, điều này là khá kinh khủng. Có thật không?
CẬP NHẬT:
Để thực hiện thao tác tương tự, tôi đã tìm thấy hàm này (trong câu trả lời tuyệt vời bên dưới) mà tôi đã thêm vào hàm.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' );
Hàm này có một hook được gọi sau khi đối tượng biến truy vấn được tạo, nhưng trước khi truy vấn thực tế được chạy.
Vì vậy, từ những gì tôi đã hiểu, nó lấy một đối tượng truy vấn làm tham số đầu vào và sửa đổi (thực sự là bộ lọc) bằng cách chọn tất cả các bài đăng không bao gồm một thẻ cụ thể (trong trường hợp của tôi là các featured
bài đăng thẻ)
Vì vậy, làm cách nào tôi có thể sử dụng truy vấn trước đó (truy vấn được sử dụng để hiển thị các bài đăng nổi bật) với chức năng này để chỉ hiển thị các bài đăng không nổi bật trong chủ đề của tôi? Hay tôi phải tạo một truy vấn mới?