Resolver un nombre de tipo de publicación personalizado vs. conflicto de enlace permanente de página (mismo slug)

19

Tengo un tipo de publicación personalizado llamado "visningshus", y también una página con esa babosa. Esto es como debería (debe) ser.

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

¿Cómo puedo hacer que Wordpress no haga que el nombre del tipo de publicación tenga prioridad, sino el enlace permanente y muestre la página?

Henrik Erlandsson
fuente

Respuestas:

33

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

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

No olvide actualizar sus enlaces permanentes después en "Configuración> Enlaces permanentes"

Kraftner
fuente
1
Funcionó a la perfección, pero ahora todos los enlaces permanentes que comienzan con el nombre del tipo de publicación personalizado dan un 404, a pesar de que son correctos en wp-admin y parece que no hay reescritura. Es decir, todos los enlaces permanentes son correctos en el sitio, pero todas las publicaciones personalizadas dan un 404. ¿Puedes ayudar con eso? :)
Henrik Erlandsson
@HenrikErlandsson Quizás su tipo de publicación tenga el mismo nombre de la página. En este caso, le recomiendo que cambie el nombre de su tipo de publicación. Ejemplo: nombre de tipo de publicación personalizada - Antes: productos Después: cpt_products.
Bruno Monteiro
Muy inteligente. Resuelve un montón de problemas
bysanchy
8

No tengo la reputación suficiente para comentar sobre la publicación de @ Carl, pero esta es la respuesta correcta (al menos a esta situación de mantener la ficha de página y la ficha de publicación personalizada igual y no usar un archivo archive.php)

Pero su respuesta darí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 observa la paginación, toma el número de página y luego, por el otro lado, lo obliga a usar la página con la ficha correspondiente y luego inserta la variable de página.

Esto, además de lo 'has_archive' => false,publicado anteriormente, debería lograr la funcionalidad deseada.

Como han dicho otros, asegúrese de eliminar las reglas de reescritura visitando Configuración> Enlaces permanentes después de realizar este cambio.

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

Andrew Herder
fuente
4

Tjena Henrik!

Creo que todo lo que necesita hacer es agregar una regla de reescritura a las reglas de reescritura de Wordpress que ya se han creado. Agregue este fragmento de código a su functions.php de su tema o inclúyalo como un pugin separado ...

add_action('init', function () {
     add_rewrite_rule('visningshus/?$','index.php?pagename=visningshus', 'top');
     flush_rewrite_rules();
}, 1000);
Carl
fuente
44
Si alguien usa esto, elimine flush_rewrite_rules();No debe cambiar las reglas de reescritura initcada vez. Vuelva a cargar una vez y luego retírelo, o elimine manualmente los enlaces permanentes yendo a la configuración de
enlaces
0

Lo resolví sin resolver el conflicto. Crea una página con slug visningshus y escribe lo que quieras en ella. Tome nota de la identificación de esta página.

Cree y personalice la plantilla archive-custom-post-type.php de la forma que desee (lo más probable es que use una plantilla de página) pero reemplace la parte del bucle con

$recent = new WP_Query("page_id=your-page-id");  
while($recent->have_posts()) : $recent->the_post();
    the_content();
endwhile;

Luego, cuando vaya a http://my-site.com/visningshus, verá el contenido administrado por la página en la URL correcta.

Déjame saber que funciona.

molokom
fuente
Buena idea, pero esto es demasiado complicado. ¿Intentaste mi solución?
kraftner
@kraftner no, no lo hice. Lo intentaré la próxima vez. ¡Gracias!
molokom
Esto también tiene algunos efectos secundarios como el encabezado y todo lo que todavía se está creando como si fuera una página de archivo y no una página. No recomendaría usar esa solución.
Kraftner
¿Qué pasa si la identificación de la página cambia? Esto no es seguro.
Joel James
0

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

'has_archive' => false

Sencillo. Sin embargo, cuando tenga problemas de paginación, eche un vistazo a

add_rewrite_rule
Vitali Protosovitski
fuente
0

Lo que me solucionó fue configurar el archivo como falso, pero también configurar el jerárquico en falso al configurar mi tipo de publicación personalizada.

Adrian Sticea
fuente
0

Aquí hay una solución general para priorizar la paginación sobre el contenido de tipos de publicaciones personalizadas para CUALQUIER babosa de tipo de publicación personalizada.

// prioritize pagination over displaying custom post type content
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, también debe asegurarse de que su tipo de publicación personalizada tenga archive = false

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

jmarceli
fuente