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


8

「宛先」というカスタム投稿タイプがあり、投稿タイプの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/

ヘルプやガイダンスは大歓迎です。私は何時間もこれに苦労しており、結果はありません:(

ありがとう

回答:


25

いくつかのこと。まず、関数名の前に一意の名前を付ける必要があります。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に続かない場合、クエリ変数は空(設定されている)になるため、それをキャッチしようとすると常に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のガイドをご覧ください。ただし、質問に関連する部分は上記に要約されています。


1
素晴らしい反応をありがとう!あなたの投稿とガイドに従って変更を加えました。しかし、ワードプレスは、URLのロード後にエンドポイントとすべての変数をリダイレクト/削除しているようです。それが正規のリダイレクトかどうかはわかりません。ただし、登録されているエンドポイントのみが削除されます。URLの末尾に任意の任意の文字列を追加すると、404が表示されます。ただし、ツアーやアクティビティが削除されるか、1つの宛先URLにリダイレクトされます。:(
チャールプレトリウス

1
問題を見つけたようです。パーマリンク設定と関係があります。カスタム設定-/%category%/%postname%/がありました。しかし、それを/%postname%/に設定しただけでは機能しますが、理由はまだわかりませんが、見た目はわかります。ありがとう\ 0 /
チャールプレトリウス

1
今すぐ/%category%/%postname%/に切り替えてみてください。再び機能する可能性があります。WPがデータを削除した理由は、書き換えルールをフラッシュする必要があったためだと思います。(たぶん。)
chrisguitarguy

1
カスタムのパーマリンク設定もありました。パーマリンクの設定に移動し、何も変更せずに[変更を保存]をクリックすると、エンドポイントが機能しました。
yitwail 2013

これは私を大いに助けてくれます!どうもありがとうございました!
fdrv 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.