Añadir extensión .html a tipos de posts personalizados

19 jul 2012, 16:47:21
Vistas: 16.2K
Votos: 12

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

5
Comentarios

Solo me pregunto por qué razón quieres añadir .html?

Vince P Vince P
19 jul 2012 18:29:47

Bueno, function post-type_permalink generará un error. Si no recibes este error, entonces tienes algo terriblemente mal en tus configuraciones de depuración. También, por favor, reformula tu pregunta con las sangrías correctas en las líneas. Gracias.

kaiser kaiser
25 jul 2012 18:11:00

@kaiser, Es solo para saber cómo puedo usar la misma configuración de enlaces permanentes en los tipos de contenido personalizados. Si configuro /$postname.html para las entradas, cómo puedo usar lo mismo para los tipos de contenido personalizados.

user983248 user983248
25 jul 2012 18:21:46

¿No leíste ni una sola línea de lo que escribí en mi comentario, verdad? Por favor, corrige tu código. Además, - no funciona en nombres de funciones...

kaiser kaiser
25 jul 2012 18:23:01

@kaiser Sí lo hice, pero no soy Flash, y tengo un problema en la mano, así que no puedo escribir tan rápido como pienso o hablo

user983248 user983248
25 jul 2012 18:29:58
Todas las respuestas a la pregunta 3
2

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.

28 jul 2012 07:41:09
Comentarios

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!

brasofilo brasofilo
28 jul 2012 16:13:13

Este código sobrescribiría cualquier otro filtro que use el filtro post_type_link

Tom J Nowell Tom J Nowell
1 abr 2017 18:34:49
0

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 para post_link para capturar esos enlaces. También podrías añadir al filtro redirect_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.
27 jul 2012 18:45:03
7

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.

19 jul 2012 17:03:44
Comentarios

No vuelvas a generar las reglas de reescritura en cada carga de página.

fuxia fuxia
19 jul 2012 17:07:50

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

user983248 user983248
19 jul 2012 17:11:58

@toscho ¿cómo propones hacer eso o detenerlo?

user983248 user983248
19 jul 2012 17:15:28

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.

fuxia fuxia
19 jul 2012 17:19:39

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

user983248 user983248
19 jul 2012 17:20:03

@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

Michael Ecklund Michael Ecklund
19 jul 2012 18:16:44

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

user983248 user983248
19 jul 2012 18:34:52
Mostrar los 2 comentarios restantes