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?


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.


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.

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.