web-dev-qa-db-ja.com

WordPressは子供を持たないすべてのカテゴリを見つける方法を提供しますか?

背景

分類法とカテゴリに違いがある で説明されているように、分類法は、分類やオブ​​ジェクトまたはデータの編成の一般化されたシステムを指します。 WordPressの場合カテゴリ、タグ、投稿フォーマット(ting)、およびリンクカテゴリは、投稿、リンク、およびメタデータを分類および整理するのに役立つ分類法に組み込まれています。用語はこれらの分類法の例です。たとえば、コンピュータソフトウェアに関するWordPressのブログをご覧ください。分類法の1つがカテゴリである場合、プログラミング言語はコンピュータソフトウェアのトピックであり、カテゴリ分類法と見なすことができるため、用語の1つはプログラミング言語になります。さらに、WordPress開発者とプラグイン開発者はregister_taxonomy()関数を使って組み込み分類法を初期化したり、 新しい分類法を作成したり WordPressで使用することができます。

ワードプレスのカテゴリを操作する

それで、WordPressは 分類API の下で興味深い機能をいくつか提供しています(コーデックスのないページ、最新のソースコードへのリンク)。それらを正しく理解していれば、私の目的のために使用できる有望な機能のいくつかは以下のとおりです。

  • get_terms()コーデックス は、ソースコードのコメントと同じことをほとんど言っています。指定された分類法または分類法のリスト内の用語を検索します。どの項が返されるかを変更するために引数の配列を提供できます。たとえば、空の用語を確実に含めるために(つまり、カテゴリまたはタグの場合はどの投稿からも参照されないように)、 hide empty 引数を0またはfalseに設定できます。
  • get_term_heirarchy():与えられた用語の子供のすべての用語IDを配列として返します。
  • term_is_ancestor_of():ちょうどそれが言うことをします。 2つの用語を比較します。用語1が参照用語、用語2が祖先をチェックする用語です。

うーん、子孫はどうですか

ここでの私の目標は、どのカテゴリにも子カテゴリがない(またはより一般的になるために子孫の用語がない)ことを見つけることです。私はまた、空のカテゴリ(子を持つがそれらを参照する投稿がないカテゴリ)を無視したくありません。

WordPressはそのような検索をする簡単な方法を持っていますか?もしそうなら、私が心配すべきパフォーマンスの懸念はありますか?

いくつかの編集:今後の参考のために例を提供するために、ここに私が働いているある硬いデータがあります...

WordPressカテゴリ管理者ビュー

Categories

ワードプレス分類法の表

Table of WordPress Taxonomy

ワードプレス用語集

Table of WordPress Terms

ワードプレス用語_関連表

Table of WordPress Term_Relationships

私のテストケースでは、私は以下を返したいです。

  • 未分類
  • ファームウェアと組み込みシステム
  • オペレーティングシステム
  • Webおよびインターネットベースのアプリケーション
  • ハードウェア

何人かは空のカウントを持っていますが、これらのすべては子供を持っていません。

2
gate_engineer

それをする簡単な方法はありません。そのためには直接問い合わせる必要があります。私は、子孫がいないか、または子孫がある場合でも、どの投稿でも使用されていない親カテゴリのみが必要であると想定しています。

global $wpdb;
$categories = $wpdb->query("SELECT $wpdb->terms.* 
                            FROM  $wpdb->terms
                            INNER JOIN $wpdb->term_taxonomy
                              ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
                            WHERE $wpdb->terms.term_id NOT IN(
                              SELECT $wpdb->term_taxonomy.parent
                              FROM $wpdb->term_taxonomy
                            )
                              AND $wpdb->term_taxonomy.taxonomy = 'category'"
                          );

オリジナルポスターのアドオンEDIT

このクエリはどのように機能しますか?

テーブルの接頭辞がmain _であるとします。最初に、どのカテゴリに子供がいないかを調べることができるように、すべてのカテゴリを取得する必要があります。これは、term_taxonomyテーブルからすべてを選択し、taxonomyフィールドがに等しい結果を制限するためにWHERE節を使用することによって行われます。 )カテゴリ

SELECT *
FROM main_terms
WHERE main_term_taxonomy.taxonomy = 'category';

ただし、termsテーブルに格納されているカテゴリの名前も必要です。そのため、INNER JOINを使用して2つのテーブルを結合します。列が含まれています( とは反対に 外部結合)。結合されている両方のテーブルは、それらを一緒に「ステッチ」するための共通の列を必要とします。

SELECT *
FROM main_term_taxonomy
INNER JOIN main_terms
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category';

最後に、term_taxonomyテーブルで別のカテゴリの親として表示されているカテゴリを除外します。これを行うには、キーワードNOT INを使用し、term_taxonomy内のparent列にあるすべてのSELECTに、別のSQLクエリを作成します。次に、このネストされたSQLクエリは、term_taxonomy.parentsにエントリがあるため、どの用語IDを結果から除外する必要があるかを示し、それらが別のカテゴリの親であることを示します。

SELECT main_term_taxonomy.* 
FROM  main_term_taxonomy
INNER JOIN main_terms
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category'
AND main_term_taxonomy.term_id NOT IN(
    SELECT main_term_taxonomy.parent
    FROM main_term_taxonomy
);

興味深いことに、これは正しい行を返しますが、カテゴリ名を含みません。これは、間違ったテーブルからすべての列を選択しているためですmain_term_taxonomy。だから私達は私達が望む情報を得るために私達のSQLのテーブルの場所を交換しなければならない。

SELECT main_terms.* 
FROM  main_terms
INNER JOIN main_term_taxonomy
ON main_term_taxonomy.term_id = main_terms.term_id
WHERE main_term_taxonomy.taxonomy = 'category'
AND main_term_taxonomy.term_id NOT IN(
    SELECT main_term_taxonomy.parent
    FROM main_term_taxonomy
);
3
sakibmoon