web-dev-qa-db-ja.com

カスタム投稿タイプの2つのカスタム分類用語の交差を取得する

モデレータによる注意 :もともと "2つのカスタム分類法にあるカスタム投稿タイプのget_postsの取得方法は?"

私は "Project Type" という名前と "Package" という名前の2つの分類法を持つカスタム投稿タイプを持っています。 "Project Type" A および "Package" Aのプロジェクトのリストを取得する必要があります。私は次のコードを使ってみました:

$args = array(
  'post_type' => 'portfolio', 
  'numberposts' => -1, 
  'project_type' => 'A', 
  'package' => 'A'
); 
$my_posts = get_posts($args);  

しかし、これはプロジェクトタイプA ORパッケージAの _いずれか_ であるすべての投稿を取得します。

_ both _ taxonomiesにある投稿のみを返したいというget_posts()の言い方はありますか?

6
Shaun

V1.3以降、 複数の分類法のクエリ プラグインはWP_Queryとうまく連携します。元の引数はそのまま機能します。

$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);

それから新しいクエリを作成して確認します。

$foo = new WP_Query($args);
var_dump($foo->posts);

私はこれを私自身のカスタム分類法の設定でテストしました、そしてそれはクエリで both にマッチした投稿だけを返しました。

QMTを使用して複数の分類用語を取得するもう1つの便利な方法は、単純なURLクエリを作成することです。

site.com/?post_type=portfolio&package=foo&project=bar

このメソッドをadd_query_args()関数と共に使用して、現在のクエリを変更するリンクをページ上に作成し、追加の用語と分類法を追加することによってそれを改良しました。入力フィールドの複数の単語がfoo + barとしてポストされるため、構文は検索入力にも適しています。これはQMTに最適です。

site.com/?post_type=portfolio&project=alpha&colors=red+blue+green

all これらの基準を満たす投稿のみを返す - タイプ:ポートフォリオ/プロジェクト:アルファ/色:赤+青+緑

4
somatic

こんにちは@ shaun

@ Rarstは正しいという点で この機能をWordPress v3.1に追加 ですが、しばらくはここにいません。今すぐ必要だと思います。 作業中のコードを取得する を試して、それを機能させることができます。 プラグイン 両方@ Rarstと- @ somaticに言及するか、必要なコードを以下のテーマに含めることができます。

次のコードは、posts_whereクエリ変数を(i.e。colon-commas)という形式の値で追加するtax_termsフックです。ここで、値はterm slugs です。

"{$varname1}:{$value1},{$varname2}:{$value2},...{$varnameN}:{$valueN}"

これは自己完結型の.phpです。add_action呼び出しとtax_terms_where()関数をテーマのfunctions.phpファイルにプルする前に、Webサイトのルートにドロップしてテストできます(または.phpファイルに独自のプラグインの)。

<?php
/*
* Adds "tax_terms" to WP_Query()
*
* See: http://lists.automattic.com/pipermail/wp-hackers/2010-October/035258.html
* See: http://wordpress.stackexchange.com/questions/2255/
*
*/

  header('Content-Type:text/plain');
  include "wp-load.php";
  add_action('posts_where','tax_terms_where',10,2);

  $result = new WP_Query('post_type=portfolio&tax_terms=project_type:A,package:A');
  foreach($result->posts as $post) {
    echo "{$post->post_title}\n";
  }

function tax_terms_where($where,$wp_query) {
  if (isset($wp_query->query)) {
    $query = $wp_query->query;
    if (is_string($query))
      parse_str($query,$query);
    if (is_array($query) && isset($query['tax_terms'])) {
      global $wpdb;
      $tax_terms = explode(',',$query['tax_terms']);
      foreach($tax_terms as $tax_term) {
        list($taxonomy,$term) = explode(':',$tax_term);
        $sql = <<<SQL
AND $wpdb->posts.ID IN (
  SELECT tr.object_id
  FROM $wpdb->term_relationships AS tr
  INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
  INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id
  WHERE tt.taxonomy='%s' AND t.slug='%s'
)
SQL;
        $where .= $wpdb->prepare($sql,$taxonomy,$term);
      }
    }
  }
  return $where;
}

たとえば、$term->term_idではなく$term->slugと一致するため、これが必要なものと正確に一致しない場合は、SQLと.phpに慣れていることを前提として、コードを変更して変更する必要はありません。

4
MikeSchinkel

Qが古くなっていますが、どうやら現時点では現在の状態です。分類クエリは3.1以降でさらに改善されました。

最近では、Codexの例のように、AND関係を使った税金クエリで簡単に処理されます。

'tax_query' => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'movie_genre',
        'field'    => 'slug',
        'terms'    => array( 'action', 'comedy' ),
    ),
    array(
        'taxonomy' => 'actor',
        'field'    => 'term_id',
        'terms'    => array( 103, 115, 206 ),
        'operator' => 'NOT IN',
    ),
),

完全なドキュメントは 分類パラメータ をご覧ください。


通常の免責事項 - 私は今までのところ私自身がカスタムのものに惑わされていませんでした。

複雑な分類法の問い合わせはWP coreには実装されていません(まだ)。 複数の分類法を照会 pluginを試してください。

1
Rarst