web-dev-qa-db-fra.com

Passage de paramètres à un modèle de page personnalisé à l'aide d'URL propres

Je passe maintenant des paramètres à un modèle personnalisé au format suivant

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

J'ai créé deux tables. J'ai donc besoin de récupérer des données et de les afficher sur ces pages.

Je voudrais qu'il utilise un format d'URL propre comme:

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

Quelqu'un peut-il dire comment cela peut être réalisé?

Merci

8
user7282

add_rewrite_rule() vous permet de transformer la jolie URL en variables.

  • numéros: (\d*)
  • section: /rid/ ou /pageid/
  • slug: ([a-zA-Z0-9-]+

Voici une classe pour enregistrer la réécriture et gérer la demande si une correspondance a été trouvée.

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

METTRE À JOUR

J'ai trouvé un moyen plus simple de gérer cela.

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

Cette nouvelle méthode utilise add_rewrite_tag with _ pour exécuter la requête pour l'ID d'une page sans perturber la requête principale. Dans l'exemple ci-dessus, 333 modifierait simplement la requête pour rechercher cet ID de publication dans pre_get_posts . Vous pouvez tout aussi facilement modifier template_redirect ou 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' );

Pour référencer tous les paramètres passés plus tard:

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

RÉFÉRENCE

3
jgraup

Si vous voulez une solution simple, cela peut être le cas (n'ayant pas testé le code, il est donc possible que ce ne soit pas si simple si cela ne fonctionne pas ...) ou au moins donne un indice de ce que vous devez faire. Si vous visitez http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/ vous trouverez un prix bonus: un générateur de règles de réécriture dans l'article. Je l'ai déjà utilisé auparavant, mais pas dans une situation comme celle-ci. Essayez de combiner cette fonction avec quelque chose comme ceci:

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

Si vous ne souhaitez pas utiliser la fonction eg_generate_rewrite_rules, vous devez configurer les règles vous-même. Vous pouvez trouver des informations sur la façon de procéder dans cet article.

Plus d'infos: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag

0
Kim