Entendiendo add_rewrite_rule

10

Estoy intentando que add_rewrite_rule funcione para extraer un parámetro de la URL y pasarlo a la solicitud. He visto una cantidad de publicaciones sobre esto, pero parece que no puede hacerlo funcionar.

Si una url comienza con una determinada cadena, me gustaría eliminarlo de la url y pasarla como parámetro de consulta.

Ejemplo de url de solicitud:

http://domain.com/foo/my_page

Esto se transformaría a

http://domain.com/my_page?param=foo

Si 'foo' no está presente, debería pasar como una solicitud normal. Esta lógica debe aplicarse a cualquier URL de página o URL de tipo de publicación personalizada en mi sitio (básicamente foo / *). Pensando que actuaría como un paso a través, si la url tiene un 'foo' eliminarlo y luego pasarlo a Wordpress para que sea normal.

Ya tengo 'param' como un query_vars permitido.

En total, debería funcionar para lo siguiente:

  
  • / foo / my_page (Page)
  •   
  • / foo / my_folder / my_page (Subpágina)
  •   
  • / foo / example_type (archivo de publicación personalizada)
  •   
  • / foo / example_type / example_post (Public Post Single)
  •   
    
pregunta Louis W 31.12.2016 - 00:34

2 respuestas

6

Bien, he conseguido ejemplos de trabajo para los 3 tipos de solicitudes. Tomó un montón de experimentación y perder el tiempo para que funcionaran. Supongo que Milo es bueno al obligar a las personas a responder sus propias preguntas.

Después de innumerables cambios y actualización de los enlaces permanentes, me di cuenta de que era mucho más fácil descifrar las direcciones URL fuera de add_rewrite_url y una vez que funcionaron, definieron la reescritura. Ejemplo siendo index.php?param=foo&post_type=example_type .

Otra cosa obvia, pero agregándola aquí para que pueda ayudar a alguien más. Debe definir las reglas personalizadas de tipo add_rewrite_rule ANTES de definir sus reglas de comodín de página / subpágina. Perdí bastante tiempo con eso y creo que es lo principal que me hizo no entender por qué las reglas no funcionaron.

Aquí están las 3 reglas que funcionan en todas mis necesidades. La regla de página / subpágina se combinó en una sola.

// Custom Post Archive
add_rewrite_rule(
    '^foo/example_type/?$',
    'index.php?param=foo&post_type=example_type',
    'top'
    );

// Custom Post Individual
add_rewrite_rule(
    '^foo/example_type/([^/]*)/?$',
    'index.php?param=foo&example_type=$matches[1]',
    'top'
    );

// Pages, Top-Level and Sub-Pages
// This MUST be placed in the code AFTER custom post add_rewrite_rule
add_rewrite_rule(
    '^foo/(.+)/?$',    
    'index.php?param=foo&pagename=$matches[1]',
    'top'
    );

Además, lo que he hecho es configurar un bucle para agregar varias reglas de tipo de publicación personalizadas. Recuerde, debe definir las reglas personalizadas de tipo add_rewrite_rule ANTES de definir sus reglas de comodín de página / subpágina.

$custom_types = array('example_type', 'projects', 'people');

foreach($custom_types as $type) {

    // Custom Post Archive
    add_rewrite_rule(
        '^foo/'.$type.'/?$',
        'index.php?param=foo&post_type='.$type,
        'top'
        );

    // Custom Post Individual
    add_rewrite_rule(
        '^foo/'.$type.'/([^/]*)/?$',
        'index.php?param=foo&'.$type.'=$matches[1]',
        'top'
        );

}

El Rewrite Analyzer que Milo transmitió fue muy útil al tratar de entender mejor cómo Wordpress consulta para páginas / posts.

    
respondido por el Louis W 05.01.2017 - 16:51
8

Una regla básica que funcionaría para tu ejemplo:

function wpd_foo_rewrite_rule() {
    add_rewrite_rule(
        '^foo/([^/]*)/?',
        'index.php?pagename=$matches[1]&param=foo',
        'top'
    );
}
add_action( 'init', 'wpd_foo_rewrite_rule' );

Esto toma lo que viene después de foo/ y lo establece como pagename para la consulta, y luego param obtiene el valor estático foo . Si necesita diferentes patrones de URL, necesitará reglas adicionales para cada patrón único. Consulte WP_Query docs para ver las distintas vars de consulta que se pueden establecer dentro de las reglas de reescritura. No se olvide de vaciar las reglas de reescritura después de agregar otras nuevas. Esto se puede hacer visitando la página de Configuración de Permalinks.

Ahora visitando tu URL de ejemplo:

http://domain.com/foo/my_page

cargará la página correcta, pero no se comportará exactamente igual que visitando:

http://domain.com/my_page?param=foo

porque al usar reescrituras internas, param se establece dentro del objeto de consulta $wp_query , no el $_GET superglobal. Si necesita trabajar con el código que busca un valor en $_GET , necesitará un paso adicional para establecer ese valor:

function wpd_foo_get_param() {
    if( false !== get_query_var( 'param' ) ){
        $_GET['param'] = get_query_var( 'param' );
    }
}
add_action( 'parse_query', 'wpd_foo_get_param' );

Otro método a considerar es el uso de puntos finales, por lo que /foo/ estaría en el final de las URL en lugar de un prefijo. La ventaja de esto es que add_rewrite_endpoint de la API simplifica la adición de todas las reglas que necesita, incluida la habilitación de paginación.

    
respondido por el Milo 02.01.2017 - 04:15

Lea otras preguntas en las etiquetas