Pasar parámetros a una plantilla de página personalizada usando URL limpias

8

Ahora paso parámetros a una plantilla personalizada en el siguiente formato

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

He creado dos tablas. Entonces necesito obtener datos y mostrarlos en esas páginas.

Me gustaría que usara un formato URL limpio como:

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

¿Alguien puede decir cómo se puede lograr esto?

Gracias

usuario7282
fuente
Totalmente posible, pero debes tener en cuenta tus babosas variables para evitar conflictos. Eche un vistazo a este artículo sobre el códice de WordPress ... este es probablemente el gancho que desea utilizar y muestra una matriz de reescritura de muestra ... codex.wordpress.org/Plugin_API/Filter_Reference/…
Matt van Andel

Respuestas:

3

add_rewrite_rule() le permite convertir la bonita URL en variables.

  • números: (\d*)
  • sección: /rid/o/pageid/
  • babosa: ([a-zA-Z0-9-]+

Aquí hay una clase para registrar la reescritura y manejar la solicitud si se ha encontrado una coincidencia.

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

ACTUALIZAR

Encontré una manera más simple de manejar esto.

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

Esta nueva forma utiliza add_rewrite_tagcon _para ejecutar la consulta para la identificación de una página sin estropear la consulta principal. En el ejemplo anterior, 333simplemente modificaría la consulta para buscar esa ID de publicación pre_get_posts. Podrías modificar template_redirecto fácilmente 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' );

Para hacer referencia a todos los parámetros pasados ​​más tarde:

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

REFERENCIA

jgraup
fuente
0

Si desea una solución simple, esta podría ser (no ha probado el código, por lo que podría no ser tan simple si no funciona ...) o, al menos, le dará alguna pista de lo que debe hacer. Si visita http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/ encontrará un premio extra: un Reescriba el generador de reglas en el artículo. He usado esto antes pero no en una situación exactamente como esta. Intenta combinar esa función con algo como esto:

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 no desea utilizar la función eg_generate_rewrite_rules, debe configurar las reglas usted mismo. Puede encontrar información sobre cómo hacerlo en ese artículo.

Más información: http://codex.wordpress.org/Rewrite_API/add_rewrite_tag

Kim
fuente