Добавление дополнительных параметров после постоянной ссылки

8 мая 2012 г., 02:44:24
Просмотры: 28.9K
Голосов: 18

Как можно добавить дополнительные параметры после постоянной ссылки, особенно если я использую пользовательский тип записи?

Например, допустим http://mysite/album/record-name является постоянной ссылкой. Как сделать так, чтобы http://mysite/album/record-name/related не вызывал ошибку 404 или перенаправление?

WordPress, похоже, не вызывает шаблон записи, если запись не существует... поэтому я немного затрудняюсь, как это сделать.

1
Комментарии

Я только что понял, что могу сделать http://mysite/album/record-name/?type=related, но это не решает мою проблему, так как я хочу красивый формат URL. Думаю, возможно, я мог бы сделать rewrite на стороне nginx, чтобы переопределить WordPress, но предпочел бы решить это средствами WordPress, если это возможно.

relm relm
8 мая 2012 г. 02:50:27
Все ответы на вопрос 3
0
19

Вы можете добавить конечную точку (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;
}
8 мая 2012 г. 03:24:23
5
12

Вы можете сделать это с помощью функции 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;
8 мая 2012 г. 03:23:25
Комментарии

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

Hexodus Hexodus
15 нояб. 2013 г. 16:14:57

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

Milo Milo
15 нояб. 2013 г. 16:39:11

О, спасибо, Milo, за разъяснение - это было очень загадочно ;)

Hexodus Hexodus
15 нояб. 2013 г. 17:05:04

@Hexodus Я не нашел в этом ничего загадочного.

Nabil Kadimi Nabil Kadimi
22 нояб. 2014 г. 01:57:37

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

Charlie Vieillard Charlie Vieillard
26 окт. 2016 г. 11:54:32
0

Чтобы добавить параметр к 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

1 апр. 2014 г. 16:59:49