Добавление дополнительных параметров после постоянной ссылки
Как можно добавить дополнительные параметры после постоянной ссылки, особенно если я использую пользовательский тип записи?
Например, допустим http://mysite/album/record-name
является постоянной ссылкой. Как сделать так, чтобы http://mysite/album/record-name/related
не вызывал ошибку 404 или перенаправление?
WordPress, похоже, не вызывает шаблон записи, если запись не существует... поэтому я немного затрудняюсь, как это сделать.
Вы можете добавить конечную точку (endpoint) к вашим URI для обработки специальных запросов.
Вот базовый пример в виде плагина. Чтобы понять, что происходит, прочитайте потрясающий туториал Кристофера Дэвиса (Почти) Полное руководство по WordPress Rewrite API.
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: Пример конечной точки T5
* Description: Добавляет конечную точку для постоянных ссылок с именем <code>epex</code>
*/
add_action( 'init', 't5_add_epex' );
function t5_add_epex()
{
add_rewrite_endpoint( 'epex', EP_PERMALINK );
}
add_action( 'template_redirect', 't5_render_epex' );
/**
* Обрабатывает вызовы конечной точки.
*/
function t5_render_epex()
{
if ( ! is_singular() or ! get_query_var( 'epex' ) )
{
return;
}
// Здесь вы, вероятно, сделаете что-то более полезное.
$post = get_queried_object();
print '<pre>' . htmlspecialchars( print_r( $post, TRUE ) ) . '</pre>';
exit;
}
add_filter( 'request', 't5_set_epex_var' );
/**
* Убеждается, что 'get_query_var( 'epex' )' не вернет просто пустую строку, если переменная установлена.
*
* @param array $vars
* @return array
*/
function t5_set_epex_var( $vars )
{
isset( $vars['epex'] ) and $vars['epex'] = true;
return $vars;
}

Вы можете сделать это с помощью функции Rewrite API add_rewrite_endpoint:
add_action( 'init', 'wpse51444_endpoint' );
function wpse51444_endpoint(){
add_rewrite_endpoint( 'related', EP_ALL );
}
add_filter( 'query_vars', 'wpse51444_query_vars' );
function wpse51444_query_vars( $query_vars ){
// добавляем related в массив распознаваемых query vars
$query_vars[] = 'related';
return $query_vars;
}
В шаблоне вы можете определить, когда присутствует ваш query var related:
if( array_key_exists( 'related' , $wp_query->query_vars ) ):
// текущий запрос заканчивается на related
endif;

Что означает wpse51444? Это просто длинная строка, чтобы избежать конфликтов с чем-то другим?

@Hexodus да, wpse = wp stackexchange, 51444 - это идентификатор этого вопроса. Вы можете изменить это на что угодно, но лучше использовать что-то, что гарантированно будет уникальным.

Не забудьте сбросить постоянные ссылки.

Чтобы добавить параметр к URL записи (постоянная ссылка), я использую следующий код:
add_filter( 'post_type_link', 'append_query_string', 10, 2 );
function append_query_string( $url, $post )
{
// Добавляем параметр my_pid со значением ID записи к URL
return $url.'?my_pid='.$post->ID;
}
Результат:
http://yoursite.com/pagename?my_pid=12345678
