Übergeben von Parametern an eine benutzerdefinierte Seitenvorlage mithilfe sauberer URLs


8

Ich übergebe jetzt Parameter an eine benutzerdefinierte Vorlage im folgenden Format

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

Ich habe zwei Tabellen erstellt. Ich muss also Daten abrufen und auf diesen Seiten anzeigen.

Ich möchte, dass es ein sauberes URL-Format verwendet, wie:

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

Kann jemand sagen, wie dies erreicht werden kann?

Vielen Dank


Völlig möglich, aber Sie müssen auf Ihre variablen Schnecken achten, um Konflikte zu vermeiden. Schauen Sie sich diesen Artikel über den WordPress-Codex an ... dies ist wahrscheinlich der Hook, den Sie verwenden möchten, und er zeigt ein Beispiel für ein Array zum Umschreiben ... codex.wordpress.org/Plugin_API/Filter_Reference/…
Matt van Andel

Antworten:


3

add_rewrite_rule() ermöglicht es Ihnen, die hübsche URL in Variablen umzuwandeln.

  • Zahlen: (\d*)
  • Abschnitt: /rid/oder/pageid/
  • Schnecke: ([a-zA-Z0-9-]+

Hier ist eine Klasse zum Registrieren des Umschreibens und zum Behandeln der Anforderung, wenn eine Übereinstimmung gefunden wurde.

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

AKTUALISIEREN

Ich habe einen einfacheren Weg gefunden, damit umzugehen.

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

Diese neue Art und Weise nutzt add_rewrite_tagmit _der Abfrage für eine Seite der ID auszuführen , ohne die Hauptabfrage vermasselt. Im obigen Beispiel 333würde nur die Abfrage geändert, um nach dieser Beitrags-ID in zu suchen pre_get_posts. Sie können genauso einfach template_redirectoder ändern 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' );

So verweisen Sie auf alle später übergebenen Parameter:

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

REFERENZ


0

Wenn Sie eine einfache Lösung wünschen, ist dies möglicherweise der Fall (Sie haben den Code nicht getestet, ist also möglicherweise nicht so einfach, wenn er nicht funktioniert ...) oder gibt zumindest einen Hinweis darauf, was Sie tun müssen. Wenn Sie http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/ besuchen , finden Sie im Artikel einen Bonuspreis: A Rewrite Rule Generator. Ich habe das schon einmal benutzt, aber nicht in einer Situation wie dieser. Versuchen Sie, diese Funktion mit so etwas zu kombinieren:

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

Wenn Sie die Funktion eg_generate_rewrite_rules nicht verwenden möchten, müssen Sie die Regeln selbst einrichten. Informationen dazu finden Sie in diesem Artikel.

Weitere Informationen: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.