Resolver conflicto entre nombre de tipo de post personalizado vs. enlace permanente de página (mismo slug)

19 feb 2014, 10:32:09
Vistas: 46.7K
Votos: 32

Tengo un tipo de post personalizado llamado "visningshus", y también una Página con ese mismo slug. Esto es como debe (tiene que) ser.

Actualmente, "http://my-site.com/visningshus" lista todas las entradas de ese tipo. Quiero mostrar la página que tiene ese slug de enlace permanente en su lugar.

¿Cómo puedo hacer que WordPress no dé precedencia al nombre del tipo de post, sino al enlace permanente, y muestre la Página?

0
Todas las respuestas a la pregunta 8
3
52

Lo más sencillo sería simplemente deshabilitar la página de archivo para este CPT:

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => false,
        [...]
    )
);

No olvides refrescar tus enlaces permanentes después en "Ajustes > Enlaces permanentes"

19 feb 2014 12:28:14
Comentarios

Funcionó perfectamente - pero ahora todos los enlaces permanentes que comienzan con el nombre del tipo de contenido personalizado devuelven un error 404, a pesar de que son correctos en wp-admin y no parece haber ninguna reescritura ocurriendo. Es decir, todos los enlaces permanentes son correctos en el sitio, pero todas las entradas personalizadas devuelven un 404. ¿Puedes ayudarme con eso? :)

Henrik Erlandsson Henrik Erlandsson
11 mar 2014 17:44:05

@HenrikErlandsson Tal vez tu tipo de contenido tenga el mismo nombre que una página. En este caso te recomiendo que cambies el nombre de tu tipo de contenido. Ejemplo: Nombre del tipo de contenido personalizado - Antes: products Después: cpt_products.

Bruno Monteiro Bruno Monteiro
6 abr 2016 20:08:19

Muy inteligente. Resuelve un montón de problemas

bysanchy bysanchy
9 abr 2017 18:08:32
0
12

No tengo suficiente reputación para comentar en la publicación de @Carl, pero su respuesta es la correcta (al menos para esta situación de mantener el slug de página y el slug del tipo de contenido personalizado iguales y no usar un archivo archive.php)

Pero su respuesta generaría errores con la paginación. Para evitar errores de paginación:

add_rewrite_rule('^visningshus/page/([0-9]+)','index.php?pagename=visningshus&paged=$matches[1]', 'top');

Esto revisa la paginación, captura el número de página, y luego lo fuerza a usar la página con el slug coincidente, insertando la variable de página.

Esto además de 'has_archive' => false, mencionado arriba debería lograr la funcionalidad deseada.

Como otros mencionaron, asegúrate de limpiar las reglas de reescritura visitando Ajustes > Enlaces permanentes después de hacer este cambio.

Espero que esto ayude a alguien, porque sé que esto me dejó perplejo durante mucho tiempo.

14 mar 2017 22:22:43
3

¡Hola Henrik!

Creo que todo lo que necesitas hacer es agregar una regla de reescritura a las reglas de reescritura de WordPress que ya han sido creadas. Añade este fragmento de código al functions.php de tu tema o inclúyelo como un plugin separado...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
13 may 2016 17:19:54
Comentarios

Si alguien usa esto, elimina flush_rewrite_rules(); No deberías cambiar las reglas de reescritura en init cada vez. Recarga una vez y luego elimínalo, o purga manualmente los enlaces permanentes yendo a la configuración de enlaces permanentes en el panel de administración y haciendo clic en "Guardar cambios".

tehlivi tehlivi
14 jun 2017 21:10:47

De todas las respuestas aquí, ¡esta fue la que funcionó para mí! Muchas gracias.

Pooja Mistry Pooja Mistry
11 jun 2020 19:12:17

RE: flush_rewrite_rules() - realmente no es una buena idea usar esta función en un hook init - o cualquier otro hook que se ejecute frecuentemente. Esto hará que tu instalación de WordPress purgue las reglas de reescritura de la base de datos y las vuelva a insertar por cada carga de página, lo cual es una sobrecarga innecesaria, razón por la cual WordPress no lo hace por sí mismo. Después de crear la regla de reescritura, simplemente ve a Ajustes > Enlaces permanentes y haz clic en guardar - esto purgará manualmente las reglas de reescritura una sola vez, que es todo lo necesario.

bosco bosco
12 jun 2021 05:36:09
0

Si registraste el tipo de contenido personalizado tú mismo, puedes cambiar el estado del archivo y la URL en tu tema o plugin.

'has_archive' => true, habilita el archivo en el enlace permanente del tipo de contenido. Así que cambia eso a:

'has_archive' => false, deshabilitará el archivo.

'has_archive' => 'custom-slug', habilitará el archivo en un slug personalizado(http://my-site.com/custom-slug/).

Si un plugin o tu tema lo registra, puedes deshabilitarlo como lo hizo krafter. También puedes usar un slug personalizado para el archivo.

register_post_type( 'visningshus',
    array(
        [...]
        'has_archive' => 'custom-slug', 
        [...]
    )
);

Si necesitas tanto la página como el archivo, la mejor manera sería poner el archivo en un slug personalizado diferente.

9 feb 2020 14:47:48
4

Lo resolví sin resolver el conflicto. Crea una página con el slug visningshus y escribe lo que quieras en ella. Toma nota del ID de esta página.

Crea y personaliza la plantilla archive-custom-post-type.php como prefieras (lo más probable es que simplemente uses una plantilla de página) pero reemplaza la parte del loop con:

$recent = new WP_Query("page_id=tu-id-de-pagina");  
while($recent->have_posts()) : $recent->the_post();
    the_content();
endwhile;

Luego, cuando vayas a http://mi-sitio.com/visningshus verás el contenido gestionado por la página en la URL correcta.

Avísame si funciona.

19 feb 2014 12:31:15
Comentarios

Buena idea, pero esto es demasiado complicado. ¿Probaste mi solución?

kraftner kraftner
19 feb 2014 12:32:51

@kraftner no, no lo hice. Lo intentaré la próxima vez. ¡Gracias!

molokom molokom
19 feb 2014 12:55:20

Esto también tiene algunos efectos secundarios como que el encabezado y todo lo demás aún se crea como si fuera una página de archivo y no una página normal. No recomendaría usar esa solución.

kraftner kraftner
19 feb 2014 13:00:30

¿Qué pasa si el ID de la página cambia? Esto no es seguro.

Joel James Joel James
6 feb 2017 09:19:05
0

No se permite votar, pero +1 por la solución de Carls, register_post_type debería tener

'has_archive' => false

Simple. Sin embargo, cuando te enfrentes a problemas de paginación, echa un vistazo a

add_rewrite_rule
23 feb 2017 19:31:02
0

Lo que solucionó el problema para mí fue configurar 'archive' como falso, pero también establecer 'hierarchical' como falso al configurar mi tipo de publicación personalizado.

5 oct 2018 15:50:24
0

Aquí hay una solución general para priorizar la paginación sobre el contenido de tipos de entrada personalizados para CUALQUIER slug de tipo de entrada personalizado.

// priorizar la paginación sobre la visualización del contenido de tipos de entrada personalizados
add_action('init', function() {
  add_rewrite_rule(
    '(.?.+?)/page/?([0-9]{1,})/?$',
    'index.php?pagename=$matches[1]&paged=$matches[2]',
    'top'
  );
});

Además de agregar este fragmento de código, también debes asegurarte de que tu tipo de entrada personalizado tenga archive = false

Y por último pero no menos importante, ve a la página de configuración de Enlaces permanentes Ajustes > Enlaces permanentes (/wp/wp-admin/options-permalink.php) y guarda la configuración actual para actualizar la estructura de enlaces en la página.

8 oct 2018 09:33:12