web-dev-qa-db-ja.com

現在の用語が別の用語の子であるかどうかを確認

特定の用語のサブカテゴリにのみ適用されるアーカイブテンプレートを作成しようとしています。私の構造は次のようになります。

  • イベント(主な分類)
    • 展示会
      • サブキャットショー1
      • サブカタログ2を表示
    • その他の分類

私はShow subcat 1Show subcat 2(そして他のサブカテゴリ)がすべて同じアーカイブテンプレートを取得したいと思います。これは私の試みの1つですが、これは絶対にうまくいきません。これが私のfunctions.phpのコードです。

    add_filter( 'template_include', 'kd_event_subcategory_archive' );

    function kd_event_subcategory_archive( $template ) {
        $term = get_queried_object()->term_id;
        if ( $term->parent == 'tradeshow' ) {
            $event_subcat = locate_template( 'taxonomy-tradeshow-subcategory.php' );

            return $event_subcat;
        }

        return $template;
    }

ある用語が自分のtradeshow用語の子であるかどうかを正しくチェックする方法を理解することはできません。

1
KreigD

あなたのチェックを妨げている2つの問題があります。

    $term = get_queried_object()->term_id;
    if ( $term->parent == 'tradeshow' ) {

で始まります:

    $term = get_queried_object()->term_id;

ここで$termは用語オブジェクトではなく用語のIDを含みます。これが期間数5であると仮定しましょう、結果は次のとおりです。

    $term = 5;
    if ( $term->parent == 'tradeshow' ) {

これはうまくいきません。 $termは数値であり、オブジェクトではないので、->parentはできません。

修正方法は、照会されたオブジェクトを直接使用することです。

    $term = get_queried_object();

これは次の問題へと導きます。

    if ( $term->parent == 'tradeshow' ) {

親は文字列ではなく、用語IDです。親が存在しない場合は0、それ以外の場合はWP_Termを検索すると表示されるように、親用語のIDです。

/**
 * ID of a term's parent term.
 *
 * @since 4.4.0
 * @var int
 */
public $parent = 0;

だからあなたはそのIDを見つけるために事前にトレードショーの用語を取得する必要があります。通常、これらのシナリオでは、開発者はスラッグをハードコードするのではなく、代わりに用語を一覧表示する設定を提供し、この種の検索を回避して柔軟性を高めるためのオプションとしてIDを格納します。

しかしこの場合はget_term_by関数を使うことができます。

$tradeshow = get_term_by('slug', 'tradeshow', 'events')

それから:

$tradeshow->term_id === $term->parent

問題とアドバイス

これらは無関係であることを私が言及したかった追加項目です

デバッグ

var_dumpの内容が何であるかを見るために$term、デバッガ、またはその他のツールを使用すると、これらの問題が明らかになります。

さらに、PHPエラーログには、PHPにとって意味がない5->parentと同等のことを試みるためのifステートメントを指す警告と通知がいっぱいになります。エラーログに注意してください。私は、予期しない警告を受け取る簡単な方法として、クエリモニタプラグインを使用することをお勧めします。

照会オブジェクトは常に用語ではありません

このコードはページが読み込まれるたびに実行されます。

add_filter( 'template_include', 'kd_event_subcategory_archive' );

function kd_event_subcategory_archive( $template ) {
    $term = get_queried_object()->term_id;
    if ( $term->parent == 'tradeshow' ) {

しかし、ユーザーが日付アーカイブまたは作者アーカイブを訪問した場合はどうなりますか?今すぐコードがとにかく実行され、エラーを生成します。そのため、このフィルタでは、ユーザーが分類アーカイブに属しているかどうか、および分類が一致しているかどうかを確認するためのテストが必要です。

それは単数の投稿かもしれません、そしてトレードショーの用語が5の用語IDを持ち、あなたがID 5の投稿またはページにいる場合、分類アーカイブ上に投稿を表示するでしょう。

別の分類法を使用する方が簡単だと思いますが。

https://codex.wordpress.org/Function_Reference/get_queried_object

  • 単一の投稿の場合は、投稿オブジェクトが返されます
  • あなたがページ上にいる場合、それはページオブジェクトを返します
  • アーカイブページを開いている場合は、投稿タイプのオブジェクトが返されます
  • あなたがカテゴリアーカイブにいるなら、それはカテゴリオブジェクトを返します
  • もしあなたが作者アーカイブにいるなら、作者オブジェクトを返します
  • 等.
4
Tom J Nowell