回答:
振り返ってみると、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( アレイ( 'taxonomy' => 'your_custom_taxonomy'、 '演算子' => '存在する' )、 )、 ); $ query = new WP_Query($ args);
基本的に、your_custom_taxonomy内の任意の用語に割り当てられた投稿を求めています。
こんにちは@Dave Morris:
あなたが正しいです、あなたが分類を無視するだけの用語がない場合、WordPressが決定します。
試すことができる主なアプローチは3つあります。
完全なSQLクエリを使用して$wpdb->get_results()
、
$post->ID
分類法のすべての投稿のsのリストを取得し、'post__id'
引数を使用してそれらを渡します、または
によって使用されるWP_Query
SQLにINNER JOIN
、分類法テーブルを参照するSQLを追加できるようにするフックの1つで注釈を付けます。
私はそれが仕方がないか、単にIDのリストを返すまで、WordPressで完全なSQLを避けようとします。そして、この場合$post-ID
、'post__id'
引数の使用のためにsのリストをプルすることは避けます。これは、多数の投稿があると、パフォーマンスの問題やメモリの問題にさえ遭遇する可能性があるためです。したがって、#3が残ります。
WP_Query
'フックPostsByTaxonomy
を使用して呼び出される拡張クラスを作成しました'posts_join
。あなたはそれをここで見ることができます:
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'
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
));
foreach($query->posts as $post) {
echo " {$post->post_title}\n";
}
PostsByTaxonomy
クラスをテーマのfunctions.php
ファイルにコピーするか、作成して.php
いるプラグインのファイル内でクラスを使用できます。
すぐにテストしたい場合は、コードの自己完結型バージョンをGistに投稿しました。これをダウンロードしてWebサーバーのルートにとしてコピーしtest.php
、ユースケースに合わせて変更してから、次のようなURLを使用してブラウザーからリクエストします。http://example.com/test.php
。
クエリに含まれる投稿からスティッキー投稿を省略するには、次のことを試してください。
$query = new PostsByTaxonomy(array(
'taxonomy' => 'category',
'posts_per_page' => 25,
'caller_get_posts' => true,
));
または、PostsByTaxonomy
クラスに固定投稿を含めないことが重要な場合は、コンストラクターに配置できます。
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で使用されることを学びました。
caller_get_posts=1
してそれらが消えるなら: codex.wordpress.org/Function_Reference/… これが役に立てば幸いです。
if(isset($query->posts_by_taxonomy))
は、オブジェクト指向の方法論とWordPressのフック方法論を組み合わせる優れた手法です。
分類法を設定し、用語を含めないようにすることができます。
例えば。
<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>
これは、分類アーカイブが実行するクエリとほとんど同じです。
WP_Query
単に破棄します。
WP_Query
残念ながらそのようなエレガントな方法で実装されていません。これは、ハードコードされた特殊なケースのほぼ1200行です。