Añadir extensión .html a tipos de posts personalizados
¿Existe alguna forma de añadir la extensión .html
a los tipos de posts personalizados sin usar plugins?
Para los posts normales puedo usar /%postname.html
en la configuración de enlaces permanentes
Para las páginas puedo usar:
add_action('init', 'change_page_permalink', -1);
function change_page_permalink() {
global $wp_rewrite;
if ( strstr($wp_rewrite->get_page_permastruct(), '.html') != '.html' )
$wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
}
¿Pero para Custom Post Types?
¿Existe algún fragmento de código similar al anterior que me permita cambiar o añadir el .html
en la URL de los custom post types?

Esto parece funcionar:
Crea las reglas de reescritura como tipo-de-entrada/nombre-de-entrada.html
. Puedes usar arrays para crear las reglas solo para un conjunto de tipos de entrada en lugar de hacerlo para todos.
add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
$new_rules = array();
foreach ( get_post_types() as $t )
$new_rules[ $t . '/([^/]+)\.html$' ] = 'index.php?post_type=' . $t . '&name=$matches[1]';
return $new_rules + $rules;
}
Formatea la nueva estructura de enlaces permanentes para estos tipos de entrada.
add_filter( 'post_type_link', 'custom_post_permalink' ); // para CPT post_type_link (en lugar de post_link)
function custom_post_permalink ( $post_link ) {
global $post;
$type = get_post_type( $post->ID );
return home_url( $type . '/' . $post->post_name . '.html' );
}
Y luego detén la redirección de las URLs canónicas para eliminar la barra diagonal al final. Esto podría necesitar más trabajo, ya que probablemente querrás mantener la redirección para la mayoría de los casos.
add_filter( 'redirect_canonical', '__return_false' );
Como otros han mencionado aquí, después de hacer lo anterior necesitarás actualizar las reglas, lo cual es posible visitando la página de administración options-permalink.php
en Escritorio -> Ajustes -> Enlaces permanentes
.

Hola Vinicius, una buena práctica al responder es prefijar todos los nombres de funciones con wpse_59024_
(ID de la pregunta) para evitar conflictos al copiar/pegar ;) . . . Y tiene el beneficio adicional de saber a qué Respuesta pertenece ese código en nuestra biblioteca de fragmentos. . . . . +1 ¡Perfecto!

Podrías añadir una regla de reescritura para esto que reemplace los enlaces permanentes predeterminados, por ejemplo para un tipo de contenido personalizado "product"...
add_action('init', 'add_html_ext_to_custom_post_types');
function add_html_ext_to_custom_post_types() {
add_rewrite_rule('^product/([^/]+)\.html', 'index.php?product=$matches[1]', 'top');
}
(No olvides limpiar tus reglas ya sea guardando nuevamente tus enlaces permanentes o usando flush_rules
como menciona @toscho arriba).
Advertencias
- No creo que funciones como
the_permalink()
usen esto, así que podrías necesitar añadir un filtro parapost_link
para capturar esos enlaces. También podrías añadir al filtroredirect_canonical
para redirigir los enlaces permanentes predeterminados, de modo que /product/foo y /product/foo/ redirijan a /product/foo.html. - Necesitarías añadir reescrituras adicionales para otras URLs que use tu sitio, como URLs de feed, páginas subsiguientes, trackbacks, etc. El código de arriba solo funcionaría para la página principal del Tipo de Contenido Personalizado.

Si prefieres un plugin de WordPress que gestione este trabajo por ti, echa un vistazo a Custom Post Type Permalinks en el repositorio de plugins de WordPress. Probado en WordPress 3.4.1 y funciona perfectamente.
Después de activar el plugin, simplemente navega a Escritorio -> Ajustes -> Enlaces permanentes. Podrás añadir reescrituras específicas para cada tipo de contenido personalizado registrado.

ese código no funciona, además si solo copias y pegas código de http://xplus3.net/2010/05/20/wp3-custom-post-type-permalinks/ asegúrate de que funcione como se espera -1 por no probarlo

flush_rules()
solo debe llamarse en la activación/desactivación porque es muy lento. Puedes verificar $GLOBALS['wp_rewrite']->rules
para comprobar si las reglas ya son conocidas.

@Michael Ecklund Devuelve un error 404, no funciona. ¿Probaste ese código?

@user983248 Error de principiante al no probar el código. Mis disculpas. Sin embargo, creo que lograr esta tarea mediante programación es bastante complejo. La solución con el plugin funciona perfectamente en WordPress 3.4.1

@MichaelEcklund Solo para mantener la apariencia y flujo, las páginas y entradas ya son .html, y personalmente no me gustan las URL que no terminan en una extensión de archivo o incluso una barra inclinada final. El plugin que mencionas no funciona en mi caso, no hace ninguna diferencia en absoluto, mira aquí -> http://wordpress.stackexchange.com/questions/59006/custom-post-types-and-permalinks Ese es el tipo de entrada personalizada donde estoy intentando añadir la extensión .html.
