特定の分類法の用語でタグ付けされた投稿を簡単に検索する方法はありますか?
私はこのテクニックを知っています:
$custom_taxonomy_query = new WP_Query(
array(
'taxonomy_name' => 'term_slug',
)
);
しかし、term_slugの代わりにワイルドカードを渡すか、または単に空の文字列を渡します。それで、それは私にその分類学のどんな用語によってタグ付けされたすべての投稿を与えるでしょう、ただ一つの特定の用語ではありません。
ご協力ありがとうございます、Dave
振り返ってみると、MikeSchinkelとt31osの提案をマッシュアップしました。その場で既存のクエリに注入することは可能ですが、WordPress 3.1が必要です。
私はデイブと似たような状況に遭遇しました。このコードは私の目的のためにトリックでした。これは世界で最も軽い方法ではありませんが、うまく機能します。
// Get all term ID's in a given taxonomy
$taxonomy = 'taxonomy_name';
$taxonomy_terms = get_terms( $taxonomy, array(
'hide_empty' => 0,
'fields' => 'ids'
) );
// Use the new tax_query WP_Query argument (as of 3.1)
$taxonomy_query = new WP_Query( array(
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'id',
'terms' => $taxonomy_terms,
),
),
) );
うまくいけば、これはあなたや他の誰かが問題を経験しているのを助けます。
ケビン
このような何かがうまくいくかもしれません:
$ args = array( 'post_type' => 'post'、 'tax_query' => array( array( '分類法'=>' your_custom_taxonomy '、 ' operator '=>' EXISTS ' )、 )、 ); $ query = new WP_Query($ args);
あなたは基本的に、your_custom_taxonomy内のあらゆる用語に割り当てられたあらゆる投稿を求めています。
こんにちは @Dave Morris:
あなたは正しいです、WordPressはあなたが彼らがあなたの分類学を単に無視するという用語を持っていないかどうか決定します。
があります 3つの主なアプローチ あなたが試すことができます:
完全なSQLクエリを使用します$wpdb->get_results()
と、
$post->ID
sのリストを取得します 分類法のすべての投稿に対して、'post__id'
引数を使用してそれらを渡します。
WP_Query
によって使用されるSQLに注釈を付ける 分類表を参照するSQL INNER JOIN
を追加することができるフックの1つを使って。
私はWordPressの中で完全なSQLを避けようとします。それは仕方がないか、単にIDのリストを返すまでです。そしてこの場合、$post-ID
のリストを引っ張って'post__id'
引数と一緒に使用することは避けましょう。投稿がたくさんあるとパフォーマンスの問題やメモリの問題に遭遇するかもしれないからです。 つまり、#3が残ります
私はWP_Query
を拡張するクラスを作成しました'posts_join
フックを使用するPostsByTaxonomy
name__と呼びます。あなたはそれをここで見ることができます:
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;
}
}
このクラスを以下のように呼びます。 引数'taxonomy'
は必須です しかしWP_Query
のように、'posts_per_page'
が期待する他のパラメータの任意の(all?)を渡すことができます。
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
あなたはあなたのテーマのfunctions.php
ファイルにPostsByTaxonomy
name__クラスをコピーすることができます、あるいはあなたが書いているかもしれないプラグインの.php
ファイルの中でそれを使うことができます。
すぐにテストしたい場合は、 コードの自己完結型バージョン をGistに投稿し、ダウンロードしてtest.php
としてWebサーバーのルートにコピーし、自分のユースケースに合わせて変更します。それからhttp://example.com/test.php
のようなURLを使ってあなたのブラウザからリクエストしてください。
クエリに含まれる投稿の中から Sticky Postsを除く これを試してください。
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
PostsByTaxonomy
name__クラスにスティッキーポストを含めないことが重要な場合は、それをコンストラクタに含めることができます。
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);
}
上記を投稿した後、私は 'caller_get_posts'は廃止予定となり、'ignore_sticky_posts'
がWordPress 3.1で使用されることを学びました。
分類法を設定し、用語を含めることを否定するだけでよいのです。
例えば。
<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>
これは、分類アーカイブが実行するクエリとほとんど同じです。