Página de tipo de entrada personalizada redirigiendo a error 404

7 mar 2016, 16:23:39
Vistas: 18.4K
Votos: 5

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.

3
Comentarios

Como no estás usando las reglas de reescritura predeterminadas, necesitas limpiar y reconstruirlas. Mira esto: custom_post_type con has_archive no cambia el permalink

cybmeta cybmeta
7 mar 2016 16:42:44

Tu archivo single debería ser single-destinations.php, no con la regla de reescritura. Y todo tu código debería estar dentro de una función enganchada a init.

Mayeenul Islam Mayeenul Islam
7 mar 2016 20:47:28

Probé single-destinations.php antes de probar single-agences.php pero no funcionó. Incluso si no usa estos archivos, debería usar single.php pero está dando un error 404. y sí, el código está en una función enganchada a init.

Deepak jha Deepak jha
7 mar 2016 20:55:44
Todas las respuestas a la pregunta 2
5
12

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:

7 mar 2016 17:11:54
Comentarios

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".

Deepak jha Deepak jha
7 mar 2016 20:22:18

¿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.

Mayeenul Islam Mayeenul Islam
7 mar 2016 20:47:08

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

Deepak jha Deepak jha
7 mar 2016 20:57:58

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. :(

Mayeenul Islam Mayeenul Islam
7 mar 2016 21:45:20

Fue debido a un plugin "Remove taxonomy base slug". Estaba en conflicto con el slug base del CPT "destinations". Tuve que usar "add_rewrite_rule" para verificar el slug y redirigirlo manualmente a la ubicación correcta.

Deepak jha Deepak jha
8 mar 2016 20:10:23
0

Se debía a un plugin "Remove taxonomy base slug". Entraba en conflicto con el slug base del CPT "destinations". Tuve que usar add_rewrite_rule para verificar el slug y redirigirlo manualmente a la ubicación correcta.

6 jul 2017 07:51:43