Hai @ Dave Morris:
Anda benar, WordPress memutuskan jika Anda tidak memiliki istilah mereka hanya akan mengabaikan taksonomi Anda.
Ada tiga (3) pendekatan utama yang bisa Anda coba:
Gunakan kueri SQL lengkap dengan $wpdb->get_results()
,
Dapatkan daftar $post->ID
s untuk semua posting di taksonomi Anda dan kemudian sampaikan dengan menggunakan 'post__id'
argumen, atau
Buat anotasi SQL yang digunakan olehWP_Query
dengan salah satu kait yang memungkinkan Anda menambahkan SQL INNER JOIN
referensi tabel taksonomi.
Saya mencoba untuk menghindari SQL lengkap di WordPress sampai tidak dapat membantu atau hanya mengembalikan daftar ID. Dan dalam hal ini saya akan menghindari menarik daftar $post-ID
s untuk digunakan dengan 'post__id'
argumen karena dapat mengalami masalah kinerja dan bahkan masalah memori jika Anda memiliki banyak posting. Sehingga meninggalkan kita dengan # 3.
Saya telah membuat kelas untuk memperpanjang yangWP_Query
disebut PostsByTaxonomy
yang menggunakan 'posts_join
'kait. Anda bisa melihatnya di sini:
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;
}
}
Anda akan memanggil kelas ini seperti yang Anda lihat di bawah. Argumen 'taxonomy'
ini diperlukan tetapi Anda dapat melewati (semua?) Dari parameter lain yang WP_Query
mengharapkan juga, seperti 'posts_per_page'
:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
Anda dapat menyalin PostsByTaxonomy
kelas ke functions.php
file tema Anda , atau Anda dapat menggunakannya dalam .php
file plugin yang mungkin Anda tulis.
Jika Anda ingin mengujinya dengan cepat, saya telah memposting versi mandiri dari kode ke Gist yang dapat Anda unduh dan salin ke root server web Anda sebagai test.php
, modifikasi untuk kasus penggunaan Anda, dan kemudian permintaan dari browser Anda menggunakan URL seperti http://example.com/test.php
.
MEMPERBARUI
Untuk menghilangkan Posting Lengket dari pos yang termasuk dalam kueri, coba ini:
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
Atau jika penting bagi Anda bahwa PostsByTaxonomy
kelas tidak pernah menyertakan posting tempel Anda bisa memasukkannya ke dalam konstruktor:
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);
}
PEMBARUAN 2
Setelah memposting di atas saya belajar 'caller_get_posts' akan usang dan 'ignore_sticky_posts'
akan digunakan di WordPress 3.1.