クリーンURLを使用してカスタムページテンプレートにパラメーターを渡す


8

次の形式でカスタムテンプレートにパラメーターを渡します

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

2つのテーブルを作成しました。したがって、データをフェッチしてそれらのページに表示する必要があります。

私はそれが次のようなきれいなURLフォーマットを使用することを望みます:

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

これをどのように達成できるか誰にも分かりますか?

ありがとう


完全に可能ですが、競合を回避するために変数スラッグに注意する必要があります。...これはあなたが使用したいフックはおそらくあり、それはサンプル書き換えアレイを示す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、with _を使用して、メインクエリを混乱させることなく、ページのIDのクエリを実行します。上記の例で333は、クエリを変更して、でその投稿IDを検索しますpre_get_poststemplate_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>";
}

参照


0

単純な解決策が必要な場合、これはそれ(コードをテストしていないため、機能していない場合はそれほど単純ではない可能性があります...)または少なくとも、必要なヒントを示します。http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/にアクセスすると、ボーナス賞品が表示されます。記事のRewrite Rule Generatorです。私はこれを以前に使用したことがありますが、このような状況ではありません。その関数を次のようなものと組み合わせてみてください:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.