Melewati parameter ke templat halaman khusus menggunakan url bersih


8

Sekarang saya meneruskan parameter ke templat khusus dalam format berikut

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

Saya telah membuat dua tabel. Jadi saya perlu mengambil data dan menampilkannya di halaman-halaman itu.

Saya ingin menggunakan format URL bersih seperti:

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

Adakah yang bisa mengatakan bagaimana ini bisa dicapai?

Terima kasih


Sangat mungkin, tetapi Anda harus memperhatikan siput variabel Anda untuk menghindari konflik. Lihatlah artikel ini pada kodeks WordPress ... ini mungkin kait yang ingin Anda gunakan dan menunjukkan contoh array penulisan ulang ... codex.wordpress.org/Plugin_API/Filter_Reference/…
Matt van Andel

Jawaban:


3

add_rewrite_rule() memungkinkan Anda untuk mengubah url cantik menjadi variabel.

  • angka: (\d*)
  • bagian: /rid/atau/pageid/
  • siput: ([a-zA-Z0-9-]+

Ini adalah kelas untuk mendaftarkan penulisan ulang dan menangani permintaan jika kecocokan telah ditemukan.

<?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

MEMPERBARUI

Saya menemukan cara yang lebih sederhana untuk menangani ini.

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

Cara baru ini digunakan add_rewrite_tagdengan _menjalankan kueri untuk ID halaman tanpa mengacaukan kueri utama. Pada contoh di atas, 333cukup modifikasi kueri untuk mencari ID kiriman di pre_get_posts. Anda dapat dengan mudah memodifikasi template_redirectatau 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' );

Untuk merujuk semua params yang diteruskan nanti:

/**
* 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>";
}

REFERENSI


0

Jika Anda menginginkan solusi sederhana ini mungkin itu (belum menguji kode sehingga mungkin tidak begitu sederhana jika tidak bekerja ...) atau setidaknya memberikan beberapa petunjuk apa yang perlu Anda lakukan. Jika Anda mengunjungi http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/ Anda akan menemukan hadiah bonus: Generator Aturan Penulisan Ulang dalam artikel tersebut. Saya telah menggunakan ini sebelumnya tetapi tidak dalam situasi yang persis seperti ini. Cobalah untuk menggabungkan fungsi itu dengan sesuatu seperti ini:

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();
}

Jika Anda tidak ingin menggunakan fungsi eg_generate_rewrite_rules, Anda perlu mengatur sendiri aturannya. Anda dapat menemukan informasi tentang cara melakukannya di artikel itu.

Info lebih lanjut: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.