Xin chào @Dave Morris:
Bạn đã đúng, WordPress quyết định nếu bạn không có thuật ngữ họ sẽ bỏ qua phân loại của bạn.
Có ba (3) cách tiếp cận chính bạn có thể thử:
Sử dụng một truy vấn SQL hoàn chỉnh với $wpdb->get_results()
,
Nhận danh sách $post->ID
s cho tất cả các bài đăng trong phân loại của bạn và sau đó chuyển chúng bằng cách sử dụng 'post__id'
đối số, hoặc
Chú thích SQL được sử dụng bởiWP_Query
một trong các hook cho phép bạn thêm SQL INNER JOIN
tham chiếu các bảng phân loại.
Tôi cố gắng tránh SQL hoàn chỉnh trong WordPress cho đến khi không thể giúp được hoặc đơn giản là trả về danh sách ID. Và trong trường hợp này, tôi sẽ tránh lấy danh sách $post-ID
s để sử dụng với 'post__id'
đối số vì nó có thể gặp vấn đề về hiệu năng và thậm chí cả vấn đề về bộ nhớ nếu bạn có nhiều bài đăng. Vì vậy, để lại cho chúng tôi với # 3.
Tôi đã tạo một lớp để mở rộngWP_Query
được gọi là PostsByTaxonomy
sử dụng 'posts_join
'hook. Bạn có thể thấy nó ở đây:
class PostsByTaxonomy extends WP_Query {
var $posts_by_taxonomy;
var $taxonomy;
function __construct($args=array()) {
add_filter('posts_join',array(&$this,'posts_join'),10,2);
$this->posts_by_taxonomy = true;
$this->taxonomy = $args['taxonomy'];
unset($args['taxonomy']);
parent::query($args);
}
function posts_join($join,$query) {
if (isset($query->posts_by_taxonomy)) {
global $wpdb;
$join .=<<<SQL
INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
AND {$wpdb->term_taxonomy}.taxonomy='{$this->taxonomy}'
SQL;
}
return $join;
}
}
Bạn sẽ gọi lớp này như bạn thấy dưới đây. Đối số 'taxonomy'
là bắt buộc nhưng bạn có thể vượt qua bất kỳ (tất cả?) Các tham số khác WP_Query
mong đợi, chẳng hạn như 'posts_per_page'
:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Bạn có thể sao chép PostsByTaxonomy
lớp vào functions.php
tệp của chủ đề hoặc bạn có thể sử dụng nó trong .php
tệp của plugin bạn có thể đang viết.
Nếu bạn muốn kiểm tra nhanh, tôi đã đăng một phiên bản mã độc lập lên Gist mà bạn có thể tải xuống và sao chép vào thư mục gốc của máy chủ web của mình dưới dạng test.php
, sửa đổi cho trường hợp sử dụng của bạn, sau đó yêu cầu từ trình duyệt của bạn bằng URL như http://example.com/test.php
.
CẬP NHẬT
Để bỏ qua Bài viết dính từ các bài đăng có trong truy vấn, hãy thử điều này:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
Hoặc nếu điều quan trọng với bạn là PostsByTaxonomy
lớp không bao giờ bao gồm các bài đăng dính bạn có thể đặt nó vào hàm tạo:
function __construct($args=array()) {
add_filter('posts_join',array(&$this,'posts_join'),10,2);
$this->posts_by_taxonomy = true;
$this->taxonomy = $args['taxonomy'];
$args['caller_get_posts'] = true // No Sticky Posts
unset($args['taxonomy']);
parent::query($args);
}
CẬP NHẬT 2
Sau khi đăng bài ở trên, tôi đã học được 'caller_get_posts' sẽ không được dùng nữa và 'ignore_sticky_posts'
sẽ được sử dụng trong WordPress 3.1.