Agregue la extensión .html (punto HTML) a los tipos de publicaciones personalizadas

10

¿Hay alguna forma de agregar la .htmlextensión a los tipos de publicaciones personalizadas sin complemento ?

Para publicaciones que puedo usar /%postname.htmlen la configuración de enlaces permanentes

Para las páginas que 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';
}

Para tipos de publicaciones personalizadas ???

¿Hay algún código similar al anterior que me permita cambiar o agregar el .htmltipo de mensaje personalizado?

usuario983248
fuente
55
Me pregunto por qué razón quieres agregar .html.
Vince Pettit
Bueno, function post-type_permalinkarrojará un error. Si no recibe este error, entonces tiene algo dolorosamente mal con su configuración de depuración. Además, modifique su pregunta con las intenciones correctas en las líneas. Gracias.
kaiser
@kaiser, es solo para saber cómo puedo usar la misma configuración de enlace permanente en los tipos de publicaciones personalizadas. Si configuro /$postname.htmllas publicaciones, ¿cómo puedo usar lo mismo para los tipos de publicaciones personalizadas?
user983248
No leíste una sola línea que escribí en mi comentario, ¿verdad? Por favor arregle su código. Tampoco -funciona en los nombres de funciones ...
kaiser
@kaiser Sí, pero no soy Flash, y tengo un problema con las manos, así que no puedo escribir como pienso o hablo
user983248

Respuestas:

8

Esto parece funcionar:

Crea las reglas de reescritura como post-type/post-name.html. Puede usar matrices para crear las reglas para solo un conjunto de tipos de publicación en lugar de hacerlo para todos ellos.

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;
}

Formatee la nueva estructura de enlaces permanentes para estos tipos de publicaciones.

add_filter( 'post_type_link', 'custom_post_permalink' ); // for cpt post_type_link (rather than 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 deje de redirigir las URL canónicas para eliminar la barra diagonal final. Esto podría necesitar más trabajo, ya que probablemente querrá mantener la redirección en la mayoría de los casos.

add_filter( 'redirect_canonical', '__return_false' );

Como otros han dicho por aquí, después de hacer lo anterior, deberá eliminar las reglas, y eso es posible visitando la options-permalink.phppágina de administración Dashboard -> Settings -> Permalinks.

vmassuchetto
fuente
66
Oi Vinicius, una buena práctica de respuesta es prefijar todos los nombres de funciones con wpse_59024_ (ID de pregunta) para evitar conflictos de copia / pasta;). . . Y tiene la ventaja adicional de saber a qué respuesta pertenece ese código en nuestra biblioteca de fragmentos. . . . . +1 Spot on!
brasofilo
Este código sobrescribiría cualquier otro filtro que use el post_type_linkfiltro
Tom J Nowell
4

Puede agregar una regla de reescritura para esto que reemplace los enlaces permanentes incorporados, por ejemplo, para un tipo de mensaje personalizado "producto" ...

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 olvide eliminar sus reglas volviendo a guardar sus flush_rulesenlaces permanentes o utilizando las notas @toscho anteriores).

Advertencias

  • No creo que funciones como the_permalink()usarían esto, por lo que es posible que deba agregar un filtro para post_linkcapturar esos enlaces. También puede agregar al redirect_canonicalfiltro para redirigir los enlaces permanentes predeterminados, de modo que / product / foo y / product / foo / redirect a /product/foo.html.
  • Debería agregar reescrituras adicionales para otras URL que utilizara su sitio, como URL de feed, páginas subsiguientes, trackbacks, etc. El código anterior simplemente funcionaría para la página principal Tipo de publicación personalizada.
Matthew Boynes
fuente
2

Si prefiere un complemento de WordPress para manejar el trabajo por usted, consulte Permalinks de tipo de publicación personalizada en el repositorio de complementos de WordPress. Probado en WordPress 3.4.1 y funciona perfectamente.

Después de activar el complemento, solo navegue hasta Panel de control -> Configuración -> Enlaces permanentes. Puede agregar reescrituras específicas para cada tipo de publicación personalizada registrada.

Michael Ecklund
fuente
3
No vacíe las reglas de reescritura en cada carga de página.
fuxia
ese código no funciona, también si solo copia y pega el código de xplus3.net/2010/05/20/wp3-custom-post-type-permalinks asegúrese de que funciona como se espera -1 para no probar
user983248
@toscho, ¿cómo se supone que debes hacer eso o detenerlo?
user983248
1
flush_rules()debe llamarse en des / activación solo porque es muy lento. Puede verificar $GLOBALS['wp_rewrite']->rulessi las reglas ya se conocen.
fuxia
@Michael Ecklund Da un 404 que no funciona. ¿Probaste ese código?
user983248