Entendiendo add_rewrite_rule

11

Estoy tratando de add_rewrite_ruletrabajar para extraer un parámetro de la URL y pasarlo a la solicitud. He visto varias publicaciones sobre esto, pero parece que no funciona.

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

Ejemplo de URL de solicitud:

http://domain.com/foo/my_page

Esto se transformaría en

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

Si 'foo' no está presente, debería pasar como una solicitud normal. Esta lógica debería 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 'foo', elimínelo y luego simplemente pase a Wordpress a lo normal.

Ya tengo 'param' como query_vars permitido.

En total, necesitaría trabajar para lo siguiente:

  • / foo / my_page (Página)
  • / foo / my_folder / my_page (Subpágina)
  • / foo / example_type (Archivo de publicaciones personalizadas)
  • / foo / example_type / example_post (Publicación personalizada individual)
Louis W
fuente
¿alguna URL, es decir, publicaciones, categorías, etiquetas, etc., no solo el pagetipo de publicación o cualquier página? ¿Qué pasa con las páginas padre / hijo en jerarquía?
Milo
@Milo, he aclarado esto para ti. Solo estoy usando páginas y tipos de publicaciones personalizadas (archivo y páginas individuales).
Louis W

Respuestas:

8

Una regla básica que funcionaría para su 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 foo/y lo establece como pagenamepara la consulta, y luego paramobtiene el valor estático foo. Si necesita diferentes patrones de URL, necesitará reglas adicionales para cada patrón único. Consulte los WP_Querydocumentos para conocer los diversos valores de consulta que se pueden establecer dentro de las reglas de reescritura. No olvides limpiar las reglas de reescritura después de agregar nuevas. Esto se puede hacer visitando la página Configuración de enlaces permanentes.

Ahora visitando su URL de ejemplo:

http://domain.com/foo/my_page

cargará la página correcta, pero no se comportará exactamente como visitar:

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

porque cuando se utilizan reescrituras internas, paramse establece dentro del $wp_queryobjeto de consulta, no en el $_GETsuperglobal. Si necesita trabajar con un código que busca un valor $_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 usar puntos finales, por /foo/lo que sería al final de las URL en lugar de como un prefijo. La ventaja de esto es que la API add_rewrite_endpointsimplifica la adición de todas las reglas que necesita, incluida la habilitación de la paginación.

Milo
fuente
Gracias por la explicación. Parece cercano, funciona para páginas pero me da un error 404 para el archivo de publicación personalizado y las URL únicas.
Louis W
bueno, sí, como dije, necesitas agregar reglas adicionales que coincidan con cada uno de esos patrones. No sé cómo se ven esas URL en su configuración.
Milo
Tengo un tipo de página personalizada llamada 'proyectos' que tiene un archivo y páginas individuales. ¿Puedes dar un ejemplo para eso y yo puedo hacer todos los demás?
Louis W
Además, no parece funcionar para subpáginas.
Louis W
1
Edite su pregunta para agregar un ejemplo de cada patrón de URL que necesite una regla. Realmente no me preocupa que mi respuesta sea aceptada, a veces puedo engañar a las personas para que respondan sus propias preguntas dándoles algo para comenzar.
Milo
6

Ok, obtuve ejemplos de trabajo para los 3 tipos de solicitudes. Tomó un montón de experimentar y perder el tiempo para que funcionen. Supongo que Milo es bueno para incitar a las personas a responder sus propias preguntas.

Después de innumerables cambios y de actualizar los enlaces permanentes, me di cuenta de que era mucho más fácil averiguar las direcciones URL fuera de add_rewrite_url y, una vez que funcionaban, definía la reescritura. Ejemplo de ser index.php?param=foo&post_type=example_type.

Otra cosa obvia, pero agregarlo aquí para que pueda ayudar a alguien más. Debe definir el tipo de publicación personalizada add_rewrite_rule rules 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 hacía no entender por qué las reglas no funcionaban.

Aquí están las 3 reglas que funcionan en todas mis necesidades. La regla 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 múltiples reglas de tipo de publicación personalizada. Recuerde, debe definir el tipo de publicación personalizada add_rewrite_rule rules ANTES de definir sus reglas 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 analizador de reescritura que Milo transmitió fue muy útil al tratar de comprender mejor cómo Wordpress consulta las páginas / publicaciones.

Louis W
fuente
Tarde al show, pero ¿puedo hacerte un ping para otro ejemplo? Eso sí, no entiendo totalmente el parámetro $ tag de add_rewrite_rule. No tengo idea de lo que significa. Tampoco entiendo el ejemplo usando pagename = $ coincide [1] '. HUH ??? Tengo una URL como domain.com/detail?id=2&it=3. Quiero que la página sea domain.com/detail/2-3/. ¿Está dispuesto?
Debbie Kurth