Usando un "slug" personalizado/dinámico para una página

23 ago 2012, 22:25:29
Vistas: 32.3K
Votos: 10

Tengo una página personalizada que usa una plantilla llamada "Stores" http://example.com/stores/. Esta página tendrá una lista de estados y/o empresas como categorías. Para este sistema tengo un tipo de entrada personalizada "store" que puede ser asignada a una única categoría (ya sea estado o empresa),

Cada tienda no es una página específica, sino información de contacto que se muestra en un diseño tipo directorio telefónico para estados/empresas.

El problema que tengo ahora es, ¿cómo puedo hacer que mi plantilla "Stores" acepte solicitudes de URL desde http://example.com/stores/california/ (sin generar error 404)?

California en este sentido no es una página, sino una consulta. Tampoco quiero crear manualmente una página para cada una de estas categorías (ya que se extrae de la base de datos y es automático). Podría usar ?state=california para este propósito, pero me gustaría aprender la forma correcta de permitir esta URL dentro de WordPress.

¿Es la forma correcta editar el archivo htaccess manualmente? ¿No se sobrescribiría si editas la estructura de enlaces permanentes? ¿Cómo formatearía el htaccess?

0
Todas las respuestas a la pregunta 4
4
17

Crear una Plantilla de Página

Añade una nueva página y asígnale el slug stores

Añadir una Variable de Consulta Pública

add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
    $vars[] = 'state';
    return $vars;
}

Añadir una Regla de Reescribir URL

Esto dirigirá la solicitud a tu página stores.

add_rewrite_rule('^stores/([^/]*)/?','index.php?post_type=page&name=stores&state=$matches[1]','top');

Dentro de tu Plantilla

Puedes acceder a tu variable de estado de la siguiente manera:

 $state = get_query_var('state');

Actualizar tus Enlaces Permanentes

Visita Ajustes->Enlaces permanentes para actualizar tus enlaces y añadir tu regla de reescritura.

23 ago 2012 23:09:13
Comentarios

Disculpa la demora. Este código funciona, pero hay un problema que no puedo identificar con el wiki. Ahora cuando voy a stores/alabama en lugar de obtener un error 404, carga correctamente la página de Tienda. Pero me redirige de vuelta a /stores/, y no hay rastro de la variable de consulta "state" (incluso hice un dump de $wp_query en mi plantilla, nada sobre alabama). ¿Por qué me redirige de vuelta a /state/? Actualicé los enlaces permanentes (por eso la URL sigue "funcionando").

Radley Sustaire Radley Sustaire
3 sept 2012 12:22:20

Actualización: Si elimino post_type=page&name=stores entonces llego a la página de destino, sin embargo la variable de consulta "state" sí existe. La redirección está eliminando la variable de consulta, aunque todavía no estoy seguro por qué especificar el tipo de publicación está causando una redirección en primer lugar.

Radley Sustaire Radley Sustaire
3 sept 2012 12:42:28

La solución con 'post_type=page&name=stores' tampoco funciona para mí. Tuve que usar el enfoque de la solución de Jared con los IDs de página.

Kevin Kevin
7 jun 2017 12:36:09

Si hacemos cambios en los enlaces permanentes, ¿no afectará a todas las URL incluyendo otros tipos de contenido personalizados y páginas que podrían no tener ese campo en particular?

Dinesh Patil Dinesh Patil
6 may 2019 12:47:53
0

Encontré la respuesta en el sitio web de WordPress y he probado la solución: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule#Using_Custom_Templates_with_custom_querystring

Crear una plantilla de página

Crea una plantilla de página para tiendas y aplícala a una página.

$stores = get_query_var('stores');

Añadir una etiqueta de reescritura

En tu archivo functions.php añade una etiqueta de reescritura, que le indica a WordPress que debe buscar esa etiqueta específica.

function custom_rewrite_tag() {
  add_rewrite_tag('%stores%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);

Añadir una regla de reescritura

Ahora para formatear la URL y dirigirla al index.php con las variables, ingresa lo siguiente en tu functions.php. Nota: Debes actualizar el page_id al ID de la página de tiendas (en este ejemplo es 12).

function custom_rewrite_rule() {
  add_rewrite_rule('^stores/([^/]*)/?','index.php?page_id=12&stores=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);

Desde ahí puedes navegar a /stores/south-dakota/ y la variable $stores en tu plantilla de página será "south-dakota".

17 abr 2015 23:33:52
0

Yo también estaba intentando hacer lo mismo y finalmente lo logré de la siguiente manera.

Añade el siguiente código a tu archivo functions.php dentro de tu tema.

add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
    $vars[] = 'state'; // Añade la variable 'state' a las variables de consulta
    return $vars;
}

// Añade una regla de reescritura para URLs del tipo /stores/estado/
add_rewrite_rule('^stores/([^/]+)/?$','index.php?pagename=stores&state=$matches[1]','top');

Dentro de tu plantilla, obtén la variable de consulta usando esto

$state = get_query_var('state'); // Obtiene el valor del parámetro 'state' de la URL
3 nov 2013 10:04:34
0

Aquí tienes un ejemplo funcional para gestionar slugs dinámicos y asignar plantillas:

Gestiona tu endpoint o slug personalizado de forma dinámica o defínelo en un archivo

/** Establece regla de reescritura para la tabla de lista de usuarios personalizada */

$customendpoint = get_option('dynamic_slug_custom_endpoint');
 
add_action('init', 'setRewriteRule');

function setRewriterule() {
    add_rewrite_rule($customendpoint . '/?', 'index.php?' . $customendpoint . '=parent-xml-page', 'top');
}

/** Lista blanca para parámetros de consulta específicos */

add_filter('query_vars', 'getQueryvar');

public function getQueryvar($query_vars) {
    $query_vars[] = $customendpoint;
    return $query_vars;
}

Incluye tu plantilla personalizada para ese slug:

/** Verifica el parámetro de consulta y redirige al archivo de plantilla */

add_action('template_include',  'redirectTemplate');

function redirectTemplate($template) {

    if (get_query_var($customendpoint == false || get_query_var($customendpoint == '') {
        return $template;
    }

    return  'your-template.php';
}
11 nov 2021 13:26:42