Página de tipo de entrada personalizada redirigiendo a error 404
He declarado el tipo de entrada como se muestra a continuación:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'agences'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'taxonomies' => array('brands', 'country'),
'supports' => array('title', 'editor', 'author', 'thumbnail', 'custom-fields')
);
register_post_type('destinations', $args);
Inicialmente podía acceder a la página individual de este tipo de entrada usando single-agences.php
pero ahora redirige a 404.
He revisado otras respuestas y encontré que es un error común pero otras soluciones no han podido resolver esto. Cualquier ayuda será maravillosa.

Un nuevo CPT registrado muestra error 404 porque la función register_post_type()
no actualiza las reglas de reescritura. Así que depende de ti si quieres hacerlo manual o automáticamente.
Manualmente:
Entra en /wp-admin/
, luego ve a Ajustes » Enlaces permanentes y simplemente haz clic en el botón Guardar cambios para actualizar las reglas de reescritura.
Automáticamente:
Puedes actualizar las reglas de reescritura usando la función flush_rewrite_rules()
. Pero como register_post_type()
se llama en el hook init
, se ejecutará cada vez que se active el hook init
. El Codex también menciona lo siguiente:
Esta función es útil cuando se usa con tipos de contenido personalizados, ya que permite la actualización automática de las reglas de reescritura de WordPress (que normalmente hay que hacer manualmente para nuevos CPT). Sin embargo, es una operación costosa, así que solo debe usarse cuando sea absolutamente necesario.
Por eso es mejor enganchar la función a algo que se ejecute una sola vez y que actualice las reglas solo cuando sea necesario. Como @cybmeta ya mostró. Pero también puedes seguir el enfoque de @bainternet:
/**
* Para activar la página individual del CPT
* @author Bainternet
* @link http://en.bainternet.info/2011/custom-post-type-getting-404-on-permalinks
* ---
*/
$set = get_option( 'post_type_rules_flased_mycpt' );
if ( $set !== true ){
flush_rewrite_rules( false );
update_option( 'post_type_rules_flased_mycpt', true );
}
Aquí está guardando un valor en la tabla options
solo para tu tipo de contenido. Si el valor no existe, actualiza las reglas de reescritura. Si existe, no lo hace.
Pero ten en cuenta que esto hace una consulta a la base de datos cada vez (si no está en caché). Por eso, yo prefiero enganchar el código en after_setup_theme
para temas o en register_activation_hook
para plugins.
Bonus
Al depurar reglas de reescritura, plugins como estos pueden ser muy útiles:

No es un CPT recién registrado. También he intentado actualizar las reglas de reescritura muchas veces pero no funcionó. Cuando uso el formato de enlace permanente "simple" funciona. Pero no con el formato "Nombre de entrada".

¿Podrías confirmar que mod_rewrite
está habilitado en tu servidor y que funciona para otras URLs estándar de esa instalación de WordPress? También me gustaría recomendar el proceso básico de depuración.

En el servidor tengo muchas instalaciones de WordPress con múltiples tipos de contenido personalizados y todas funcionan correctamente.

Entonces es imposible para nosotros detectarlo. Puedes compartir tu producto usando GitHub, Bitbucket, GitLab, etc., para que alguien pueda probar si funcionó globalmente o no. Es demasiado localizado a tu entorno de desarrollo, que nadie puede tocar, me temo. :(
