web-dev-qa-db-ja.com

カスタム投稿タイプパーマリンクエンドポイント

"destination"というカスタム投稿タイプがあり、投稿タイプのEPマスクをデフォルトのEP_PERMALINKに設定しました。次のように、エンドポイントをいくつか追加しました。

add_filter( 'query_vars', 'add_query_vars');

function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

add_action('init', 'add_endpoints');

function add_endpoints(){
    global $wp_rewrite; 

    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);

    $wp_rewrite->flush_rules();
}

これを通常の投稿でテストすると、必要なテンプレートにリダイレクトされます(単一のテンプレートフック用のテンプレートリダイレクトがあります)。

すなわち。 somesite.com/test-category/test/activities/

ただし、投稿タイプ(階層型)の場合は、URLからエンドポイントを削除し、single-destination.phpテンプレートのままにします。

すなわち。 somesite.com/destination/south-africa/kruger-national-park/activities/

になる

somesite.com/destination/south-africa/kruger-national-park/

任意の助けやガイダンスは大歓迎です。私は何時間もの間これに苦労していました、そして、結果はありません:(

ありがとう

8
Charl Pretorius

いくつかあります。まず、あなたの関数名はユニークなものを前に付ける必要があります。 WordPressは大きなエコシステムであり、他の誰かがあなたが考えることができるすべての一般的な関数名をおそらく使っています。

次に、add_rewrite_endpointがあなたに代わってクエリ変数を追加します。だからあなたはこれを必要としません:

add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

すべてのロードで書き換え規則をフラッシュするのはお勧めできません。これはあなたのルールが追加された後に一度だけ行われる必要があります。プラグインのアクティブ化と同じです。それであなたはadd_endpoints関数はこれに短絡されるかもしれません(上記の1つの点につきより良い関数名で)。

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);
}

これは投稿にはうまくいきます。ページやその他の階層型の投稿タイプで機能させたい場合は、EP_PAGESエンドポイントマスクを使用する必要があります。

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PAGES);
    add_rewrite_endpoint('activities', EP_PAGES);
}

しかし、それでもまだあなたの期待通りには動かないでしょう。エンドポイントは、それ以降の値にクエリ変数を等しく設定します。あなたのURLが….

yoursite.com/some-country/some-city/activities/asdf

クエリ変数アクティビティはasdfになります。 activitiesの後に何も続かないと、あなたの問い合わせvarは空になるでしょう(しかし設定されます)、それであなたがそれをキャッチしようとするとそれは常にfalseと評価されます...

<?php
add_action( 'template_redirect', 'wpse42279_catch_vars' );
function wpse42279_catch_vars()
{
    if( get_query_var( 'tours' ) )
    {
        // do stuff!
        exit();
    }
}

これを回避するには、requestをフィルタリングし、ツアーとアクティビティの値が設定されている場合はそれらの値をtrueに変更します。

<?php
add_filter( 'request', 'wpse42279_filter_request' );
function wpse42279_filter_request( $vars )
{
    if( isset( $vars['tours'] ) ) $vars['tours'] = true;
    if( isset( $vars['activities'] ) ) $vars['activities'] = true;
    return $vars;
}

この Rewrite APIガイドを見てください 私が書いた。あなたの質問に関連する部分は、しかし、上記に要約されています。

24
chrisguitarguy