it-swarm.com.de

Übergeben von Parametern an eine benutzerdefinierte Seitenvorlage unter Verwendung sauberer URLs

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 wie das folgende verwendet:

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

Kann jemand sagen, wie dies erreicht werden kann?

Vielen Dank

8
user7282

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

  • zahlen: (\d*)
  • abschnitt: /rid/ oder /pageid/
  • slug: ([a-zA-Z0-9-]+

Hier ist eine Klasse, um das Umschreiben zu registrieren und die Anfrage zu bearbeiten, 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 Methode verwendet add_rewrite_tag mit _, um die Abfrage für die ID einer Seite auszuführen, ohne die Hauptabfrage zu verfälschen. Im obigen Beispiel würde 333 nur die Abfrage ändern, um nach dieser Beitrags-ID in pre_get_posts zu suchen. Sie können auch template_redirect oder template_include ändern.

/**
 * 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

3
jgraup

Wenn Sie eine einfache Lösung suchen, ist dies möglicherweise die Lösung (Sie haben den Code noch nicht getestet und sind möglicherweise nicht so einfach, wenn er nicht funktioniert ...) oder Sie geben 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 einen Bonuspreis: A Rewrite Rule Generator im Artikel. Ich habe das vorher benutzt, aber nicht in einer Situation genau so. Versuchen Sie, diese Funktion mit 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

0
Kim