Truyền tham số cho mẫu trang tùy chỉnh bằng cách sử dụng url sạch


8

Bây giờ tôi chuyển các tham số cho một mẫu tùy chỉnh theo định dạng sau

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

Tôi đã tạo ra hai bảng. Vì vậy, tôi cần tìm nạp dữ liệu và hiển thị chúng trên các trang đó.

Tôi muốn nó được sử dụng định dạng URL sạch như:

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

Bất cứ ai có thể nói làm thế nào điều này có thể đạt được?

Cảm ơn


Hoàn toàn có thể, nhưng bạn phải chú ý đến những con sên biến đổi của mình để tránh xung đột. Hãy xem bài viết này trên codex WordPress ... đây có thể là cái móc bạn muốn sử dụng và nó hiển thị một mảng viết lại mẫu ... codex.wordpress.org/Plugin_API/Filter_Reference/ tựa
Matt van Andel

Câu trả lời:


3

add_rewrite_rule() cho phép bạn biến url đẹp thành biến.

  • số: (\d*)
  • phần: /rid/hoặc/pageid/
  • sên ([a-zA-Z0-9-]+

Dưới đây là một lớp để đăng ký viết lại và xử lý yêu cầu nếu một trận đấu đã được tìm thấy.

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

CẬP NHẬT

Tôi tìm thấy một cách đơn giản hơn để xử lý này.

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

Phương pháp mới này sử dụng add_rewrite_tagvới _để chạy các truy vấn cho ID của trang web mà không rối tung lên truy vấn chính. Trong ví dụ trên, 333sẽ chỉ sửa đổi truy vấn để tìm ID bài đăng đó pre_get_posts. Bạn có thể dễ dàng sửa đổi template_redirecthoặc 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' );

Để tham khảo tất cả các thông số được thông qua sau:

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

TÀI LIỆU THAM KHẢO


0

Nếu bạn muốn một giải pháp đơn giản thì đây có thể là nó (chưa kiểm tra mã nên có thể không đơn giản nếu nó không hoạt động ...) hoặc ít nhất nó sẽ đưa ra một số gợi ý những gì bạn cần làm. Nếu bạn truy cập http://ther Beforei.am/2011/10/28/advified-taxonomy-queries-with-pretty-urls/ bạn sẽ tìm thấy một phần thưởng: Trình tạo quy tắc viết lại trong bài viết. Tôi đã sử dụng điều này trước đây nhưng không phải trong một tình huống chính xác như thế này. Hãy thử kết hợp chức năng đó với một cái gì đó như thế này:

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

Nếu bạn không muốn sử dụng hàm eg_generate_rewrite_rules, bạn cần tự mình thiết lập các quy tắc. Bạn có thể tìm thấy thông tin về cách làm điều đó trong bài viết đó.

Thông tin thêm: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.