分類法のすべての用語のカスタム分類法WP_Query?


8

特定の分類法の用語でタグ付けされた投稿をクエリする簡単な方法はありますか?

私はこのテクニックを知っています:

$custom_taxonomy_query = new WP_Query( 
 array(
  'taxonomy_name' => 'term_slug',
 )
);

しかし、term_slugの代わりにワイルドカードを渡すか、おそらく空の文字列を渡します。次に、特定の1つの用語だけでなく、その分類法の任意の用語でタグ付けされたすべての投稿が表示されます。

助けてくれてありがとう、デイブ

回答:



23

私はデイブと同じような状況に遭遇しました。このコードは私の目的のためにトリックを行いました。これは世界で最も無駄のないオプションではありませんが、うまく機能します。

// 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,
        ),
    ),
) );

うまくいけば、これはあなたや問題を経験している他の人を助けるでしょう。

ケビン


これは私にとって非常に役に立ちました。ありがとう@kevinlearynet
Tyrun

今日もまだ相対的
user1676224

7

このような何かがうまくいくかもしれません:

$ args = array(
    'post_type' => 'post'、
    'tax_query' => array(
        アレイ(
            'taxonomy' => 'your_custom_taxonomy'、
            '演算子' => '存在する'
        )、
    )、
);
$ query = new WP_Query($ args);

基本的に、your_custom_taxonomy内の任意の用語に割り当てられた投稿を求めています。


4

こんにちは@Dave Morris:

あなたが正しいです、あなたが分類を無視するだけの用語がない場合、WordPressが決定します。

試すことができる主なアプローチ3つあります。

  1. 完全なSQLクエリを使用し$wpdb->get_results()

  2. $post->ID分類法のすべての投稿のsのリストを取得し、'post__id'引数を使用してそれらを渡します、または

  3. によって使用される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);
  }

アップデート2

上記を投稿した後、 'caller_get_posts'は廃止'ignore_sticky_posts'され、WordPress 3.1で使用されることを学びました。


マイク、助けてくれてありがとう。どういうわけかそれを動作させることができません。私のカスタム分類法から割り当てられた用語を含む投稿のみを返すのではありません。それは常に他の投稿を返すようです。ただし、すべての投稿が返されるわけではないため、間違いなく何かを実行しています... $ query-> have_posts()関数を使用して反復できますか?どちらの方法も、どちらの方法でもうまくいかないようです。
Dave Morris、

あ、これは面白い。私が期待している2つの投稿を取得するクエリがmysqlログで見つかり、それが機能します。しかし、何らかの理由で、$ query-> postsをループすると5つの投稿が返されます。他に気が付くのは、カスタム分類の投稿クエリが実行された直後に、post_idによってさらに3つの投稿を取得する別のクエリが実行されることです。そして、5つの投稿すべてが1つの結果配列に配置されると思います。
Dave Morris、

私はそれを理解したと思います。このカスタムクエリにはスティッキーな投稿が含まれているようですが、カスタムの分類には含まれていません。スティッキーな投稿を適切に尊重する方法、または少なくともこの特定のクエリから除外する方法に関するアイデアはありますか?おかげで、デイブ
デイブ・モリス

まあ、それらは「粘着性」ですよね?:)それは奇妙な振る舞いだと思いますが、もしあなたが使用caller_get_posts=1してそれらが消えるなら: codex.wordpress.org/Function_Reference/… これが役に立てば幸いです。
MikeSchinkel 2010年

これif(isset($query->posts_by_taxonomy))は、オブジェクト指向の方法論とWordPressのフック方法論を組み合わせる優れた手法です。
Jan Fabry

1

分類法を設定し、用語を含めないようにすることができます。

例えば。

<?php
$your_query = new WP_query;
$your_query->query( array( 'taxonomy' => 'your-taxonomy-name' ) );
?>

これは、分類アーカイブが実行するクエリとほとんど同じです。


それはうまくいきません。
Dave Morris

query.phpの行1432は、分類法または用語が空であるかどうかをチェックするため、スラッグを渡すことはできません...他のアイデアはありますか?
Dave Morris、

@ t31os-それも最初の反応かもしれません。忘れて以来、何度かつまずいてしまいました。しかし、@ Dave Morrisは正しいです。分類法/用語のペアではない場合は、WP_Query単に破棄します。
MikeSchinkel

6
@ t31os-うん、WP_Query残念ながらそのようなエレガントな方法で実装されていません。これは、ハードコードされた特殊なケースのほぼ1200行です。
MikeSchinkel 2010年

3
「ハードコードされた特殊なケースのほぼ1200行。」...それは私を
笑わせました
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.