web-dev-qa-db-ja.com

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

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

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

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

しかし、term_slugの代わりにワイルドカードを渡すか、または単に空の文字列を渡します。それで、それは私にその分類学のどんな用語によってタグ付けされたすべての投稿を与えるでしょう、ただ一つの特定の用語ではありません。

ご協力ありがとうございます、Dave

6
Dave Morris

振り返ってみると、MikeSchinkelとt31osの提案をマッシュアップしました。その場で既存のクエリに注入することは可能ですが、WordPress 3.1が必要です。

分類法からの用語を含む投稿のRSSフィードを取得するためのプラグイン。

1
hakre

私はデイブと似たような状況に遭遇しました。このコードは私の目的のためにトリックでした。これは世界で最も軽い方法ではありませんが、うまく機能します。

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

うまくいけば、これはあなたや他の誰かが問題を経験しているのを助けます。

ケビン

18
Kevin Leary

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

 $ args = array(
 'post_type' => 'post'、
 'tax_query' => array(
 array(
 '分類法'=>' your_custom_taxonomy '、
' operator '=>' EXISTS '
)、
)、
); 
 $ query = new WP_Query($ args); 

あなたは基本的に、your_custom_taxonomy内のあらゆる用語に割り当てられたあらゆる投稿を求めています。

5
laurenfs132

こんにちは @Dave Morris:

あなたは正しいです、WordPressはあなたが彼らがあなたの分類学を単に無視するという用語を持っていないかどうか決定します。

があります 3つの主なアプローチ あなたが試すことができます:

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

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

  3. WP_Queryによって使用されるSQLに注釈を付ける 分類表を参照するSQL INNER JOINを追加することができるフックの1つを使って。

私はWordPressの中で完全なSQLを避けようとします。それは仕方がないか、単にIDのリストを返すまでです。そしてこの場合、$post-IDのリストを引っ張って'post__id'引数と一緒に使用することは避けましょう。投稿がたくさんあるとパフォーマンスの問題やメモリの問題に遭遇するかもしれないからです。 つまり、#3が残ります

私はWP_Queryを拡張するクラスを作成しました'posts_joinフックを使用するPostsByTaxonomyname__と呼びます。あなたはそれをここで見ることができます:

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ファイルにPostsByTaxonomyname__クラスをコピーすることができます、あるいはあなたが書いているかもしれないプラグインの.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,
));

PostsByTaxonomyname__クラスにスティッキーポストを含めないことが重要な場合は、それをコンストラクタに含めることができます。

  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で使用されることを学びました。

3
MikeSchinkel

分類法を設定し、用語を含めることを否定するだけでよいのです。

例えば。

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

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

1
t31os