web-dev-qa-db-ja.com

フィルターされたタグに基づいて1つのストリングのみをエコーするステートメントがネストしていますか?

目標は、/ ourcoming-eventsページにアクセスしたときに、イベントの種類や地域でフィルタをかけることができることです。

ドロップダウンからオプションを選択したら、そのページのタイトルをブレッドクラムに表示します。たとえば、パロアルトで自分の近くのイベントを見たい場合は、Northern Californiaを選択します。これがその選択のコードです。

<a class="dropdown-item" href="<?= $full_uri . "?tag=northern-california" ?>">
    Northern California
</a>

近くにイベントが見つからない場合は、州全体を選択できます。

<a class="dropdown-item" href="<?= $full_uri . "?tag=california" ?>">
    California
</a>

あなたがどこにでも旅行することが可能であったならば、あなたはイベントによって選択することができます(追加のフィルタで)

<a class="dropdown-item" href="<?= $full_uri . "?tag=seminar" ?>">
    Seminar
</a>

URLはそのタグが選択された状態で終わるのでis_tagで解決されることを望んでいました、それはフィルタがあなたを指示するように設定されている方法ですがそれは動作しません(何も表示しません)。 has_tagだけが動作しますが、問題は各タグ、この場合はregion、state、およびevent typeについてすべての文字列がエコーされることです。これが文字列をエコーするための私のphpです。

if(has_tag( 'northern-california' || 'southern-california' || 'nevada' || 'webinar' || 'seminar' || 'industry-events')) {
    echo '&nbsp;/ ' . '<a href="<?php echo $event_tag; ?>"><span class="event-bread">';
}

if(is_tag( 'northern-california' )) {
    $event_tag = 'northern-california';
    echo "Northern California";
}

if(is_tag( 'northern-california' )) {
    $event_tag = 'northern-california';
    echo "Northern California";
}
/* other regions omitted for brevity */

if(is_tag( 'seminar' )) {
    $event_tag = 'seminar';
    echo "Seminars";
}
/* other event types omitted for brevity */

/* i think this below is a sloppy way to close the div */
if(has_tag( 'northern-california' || 'southern-california' || 'nevada' || 'webinar' || 'seminar' || 'industry-events')) {
    echo '</span></a>';
}

更新1

私のfunctions.phpにこれを追加した答えに基づいて

function event_tag_url() {
    add_filter( 'query_vars', function( $eventVars ) {
        $eventVars[] = 'eventTag';
        return $$eventVars;
    }, 10, 1 );
}

それから私のcategory.phpで私はswitch文に変更しました

switch( get_query_var( 'eventTag' ) ) {
    case 'california':
        $eventTag = 'california';
        echo "California";
    break;
    case 'northern-california':
        $eventTag = 'northern-california';
        echo "Northern California";
    break;
    case 'southern-california':
        $eventTag = 'southern-california';
        echo "Southern California";
    break;
    case 'seminar':
        $eventTag = 'seminar';
        echo "Seminars";
    break;                                
    default:
        $eventTag = 'all';
    break;
}

これは何も反響していません。それでも、複数のタグがある場合に起こることの問題を解決するようには思われません。私は解決策がページに設定されているタグを探す必要がありますか?

1
JGallardo

is_tag() は、クエリが既存のタグアーカイブページに対するものであるかどうかを返します。これはあなたが使いたいものではありません。

代わりに、 get_query_var() を使用してください。

get_query_var( 'tag' )はURLのtagクエリ変数を調べます。たとえば、あなたのURLが

https://example.com/?tag=this&other=that

その後:

  • get_query_var( 'tag' )thisを返します
  • 戻り値thatを伴うget_query_var( 'other' )

たくさんのifを使う代わりに、PHP switchコンストラクトを使うことができます。

//* Use switch instead of a long series of ifs
$tag = get_query_var( 'tag' );
switch( $tag ) {
  case 'northern-california':
    $tag = 'Northern California';
    break;
  case 'seminar':
    $tag = 'Seminar';
    break;
  //* Etc.
  default:
    $tag = 'All';
    break;
}
//* Do something useful with $tag

しかし、カスタムクエリ変数にget_query_var()を使用するには、WordPressが関数を使用して取得する変数名の配列にクエリ変数を追加する必要があります。あなたがget_query_var()を試みる前にロードされている限り、これはあなたのテーマのfunctions.phpまたは単純なプラグインに入れることができます。

get_query_var()関数で使用される文字列名は、フィルタで使用される名前とまったく同じでなければなりません。クエリ変数としてeventTagを使用する場合は、それをquery_vars配列に追加し、それをURLのクエリ変数として使用する必要があります。

https://example.com/?eventTag=california

これはあなたのfunctions.phpファイルに入ります

//* Allow custom query var 'tag'
add_filter( 'query_vars', function( $vars ) {
  //* Use whatever custom query var you want, but it needs to be exactly the same
  $vars[] = 'tag';
  $vars[] = 'eventTag';
  return $vars;
}, 10, 1 );

あなたがクロージャを使うのが好きでないならば:

add_filter( 'query_vars', 'wpse_261930_query_vars', 10, 1 );
function wpse_261930_query_vars( $vars ) {
  $vars[] = 'tag';
  return $vars;
}

URLを2つの異なるタグで構成する方法がわかりません。

1
Nathan Johnson