Передача параметров в пользовательский шаблон страницы с использованием чистых URL

8

Теперь я передаю параметры в пользовательский шаблон в следующем формате

www.example.com/?pageid=12&rid=24&title=this-is-the-title

Я создал две таблицы. Поэтому мне нужно получить данные и отобразить их на этих страницах.

Я хотел бы использовать чистый формат URL, например:

www.example.com/pageid/12/rid/24/title/this-is-the-title

Кто-нибудь может рассказать, как этого можно достичь?

Спасибо

user7282
источник
Вполне возможно, но вы должны помнить о переменных переменных, чтобы избежать конфликтов. Взгляните на эту статью о кодексе WordPress ... это, вероятно, тот хук, который вы хотели бы использовать, и он показывает пример массива перезаписи ... codex.wordpress.org/Plugin_API/Filter_Reference/…
Мэтт ван Андел

Ответы:

3

add_rewrite_rule() позволяет превратить симпатичный URL в переменные.

  • номера: (\d*)
  • раздел: /rid/или/pageid/
  • пробковый: ([a-zA-Z0-9-]+

Вот класс для регистрации перезаписи и обработки запроса, если совпадение было найдено.

<?php

if ( ! class_exists( 'CPTURLRewrite' ) ):

    class CPTURLRewrite {
        const ENDPOINT_QUERY_NAME  = 'pageid';
        const ENDPOINT_QUERY_PARAM = '__pageid';

        // WordPress hooks

        public function init() {
            add_filter( 'query_vars', array ( $this, 'add_query_vars' ), 0 );
            add_action( 'parse_request', array ( $this, 'sniff_requests' ), 0 );
            add_action( 'init', array ( $this, 'add_endpoint' ), 0 );
        }

        // Add public query vars

        public function add_query_vars( $vars ) {

            // add all the things we know we'll use

            $vars[] = static::ENDPOINT_QUERY_PARAM;
            $vars[] = 'pageid';
            $vars[] = 'rid';
            $vars[] = 'title';

            return $vars;
        }

        // Add API Endpoint

        public function add_endpoint() {

            // numbers:   (\d*)
            // section:   /rid/
            // slug:      ([a-zA-Z0-9-]+

            add_rewrite_rule( '^' . static::ENDPOINT_QUERY_NAME . '/(\d*)/rid/(\d*)/title/([a-zA-Z0-9-]+)?', 'index.php?' . static::ENDPOINT_QUERY_PARAM . '=1&pageid=$matches[1]&rid=$matches[2]&title=$matches[3]', 'top' );

            //////////////////////////////////
            flush_rewrite_rules( false ); //// <---------- REMOVE THIS WHEN DONE
            //////////////////////////////////
        }

        // Sniff Requests

        public function sniff_requests( $wp_query ) {
            global $wp;

            if ( isset(
                $wp->query_vars[ static::ENDPOINT_QUERY_PARAM ],
                $wp->query_vars[ 'pageid' ],
                $wp->query_vars[ 'rid' ],
                $wp->query_vars[ 'title' ] ) ) {
                $this->handle_request(); // handle it
            }
        }

        // Handle Requests

        protected function handle_request() {
            global $wp;

            // (optional) act on the query vars

            $pageid = $wp->query_vars[ 'pageid' ];
            $rid = $wp->query_vars[ 'rid' ];
            $title = $wp->query_vars[ 'title' ];

            // (optional) select your custom template

            add_filter( 'template_include', function( $original_template ) {
                return __DIR__ . '/custom.php';
            } );
        }
    }

    $wpCPTURLRewrite = new CPTURLRewrite();
    $wpCPTURLRewrite->init();

endif; // CPTURLRewrite

ОБНОВИТЬ

Я нашел более простой способ справиться с этим.

http://example.com/pageid/333/rid/444/title/your-title-here/

Этот новый способ использует add_rewrite_tagс _для выполнения запроса для ID страницы только не мешая основной запрос. В приведенном выше примере, 333просто измените запрос, чтобы найти этот идентификатор сообщения в pre_get_posts. Вы можете так же легко изменить template_redirectили template_include.

/**
 * Register a rewrite endpoint for the API.
 */
function prefix__init() {

    // add tags with `_` prefix to avoid screwing up query
    add_rewrite_tag( '%_pageid%', '(\d*)' );
    add_rewrite_tag( '%_rid%', '(\d*)' );
    add_rewrite_tag( '%_title%', '([a-zA-Z\d\-_+]+)' );

    // create URL rewrite
    add_rewrite_rule( '^pageid/(\d*)/rid/(\d*)/title/([a-zA-Z\d\-_+]+)?', 'index.php?_pageid=$matches[1]&_rid=$matches[2]&_title=$matches[3]', 'top' );

    // required once after rules added/changed
    // flush_rewrite_rules( true );
}

add_action( 'init', 'prefix__init' );

/**
 * Handle data (maybe) passed to the API endpoint.
 *
 * @param $query
 */
function prefix__pre_get_posts( $query ) {

    if ( isset( $query->query_vars[ '_pageid' ], $query->query_vars[ '_rid' ], $query->query_vars[ '_title' ] ) ) {

        // set the query to search for a page using `_pageid`
        $query->set( 'p', $query->query_vars[ '_pageid' ] );
    }
}

add_action( 'pre_get_posts', 'prefix__pre_get_posts' );

Для ссылки на все параметры, переданные позже:

/**
* Debug the query params at any point
*/
function prefix__show_query_args() {
 global $wp_query;

    echo "<pre>";
    print_r( array (
        'pageid' => $wp_query->query_vars[ '_pageid' ],
        'rid'    => $wp_query->query_vars[ '_rid' ],
        'title'  => $wp_query->query_vars[ '_title' ],
        'file'   => __FILE__,
        'line'   => __LINE__,
    ) );
    echo "</pre>";
}

ССЫЛКА

jgraup
источник
0

Если вам нужно простое решение, это может быть (не проверял код, поэтому не может быть таким простым, если он не работает ...) или, по крайней мере, он дает подсказку, что вам нужно сделать. Если вы посетите http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/, вы найдете бонусный приз: Генератор правил переписывания в статье. Я использовал это раньше, но не в такой ситуации. Попробуйте объединить эту функцию с чем-то вроде этого:

add_rewrite_tag('%pageid%','([^&]+)');
add_rewrite_tag('%rid%','([^&]+)');
add_rewrite_tag('%title%','([^&]+)');

/* Generate rewrite rules. */
add_action( 'generate_rewrite_rules', 'example_add_rewrite_rules' );
function example_add_rewrite_rules() {
    global $wp_rewrite;
    $new_rules = eg_generate_rewrite_rules( 'post' , array('pageid','rid','title')); //    post = the post type you use
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

/* Flush rewrite rules on theme activation only. */
add_action( 'load-themes.php', 'frosty_flush_rewrite_rules' );
function frosty_flush_rewrite_rules() {
    global $pagenow;
    if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )
        flush_rewrite_rules();
}

Если вы не хотите использовать функцию eg_generate_rewrite_rules, вам нужно установить правила самостоятельно. Вы можете найти информацию о том, как это сделать, в этой статье.

Дополнительная информация: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag

Ким
источник