Конечная точка Постоянной ссылки пользовательского типа сообщения

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функция может быть закорочена на это (с лучшим именем функции в каждой точке выше).

<?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 будет пустым (но установлен), поэтому он всегда будет оцениваться как ложный, когда вы пытаетесь его перехватить ...

<?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, которое я написал. Тем не менее, соответствующие части вашего вопроса приведены выше.

chrisguitarguy
источник
1
Спасибо за отличный ответ! Я внес изменения в соответствии с вашим постом и руководством. Но, похоже, WordPress перенаправляет / удаляет конечную точку и любые переменные после загрузки URL. Я не уверен, что это канонический редирект или что. Но это только удаляет зарегистрированные конечные точки. Если я добавлю что-нибудь arb в конец URL-адреса, я получу 404. Но туры или мероприятия удаляются или перенаправляются на один URL-адрес назначения. :(
Чарль Преториус
1
Кажется, я нашел проблему. Связано с настройками постоянной ссылки. У меня была пользовательская настройка - /% category% /% postname% /. Но если я установлю просто /% postname% /, это сработает, пока не знаю почему, но посмотрим. Спасибо \ 0 /
Чарль Преториус
1
Вы должны попытаться переключить его обратно на /% category% /% postname% / now, и это может сработать снова. Я подозреваю, что причина, по которой WP удалял ваши материалы, заключалась в том, что вам нужно было очистить правила перезаписи. (Может быть.)
chrisguitarguy
1
У меня также была настраиваемая постоянная ссылка. Я просто зашел в «Настройки постоянных ссылок» и нажал «Сохранить изменения», ничего не меняя, и тогда конечная точка сработала.
2013 года
Это мне очень помогает! Большое спасибо братан!
фдрв