J'ai un CPT avec slug function
(singulier) et archive slug functions
(pluriel).
Structure permanente pour:
/function/[postname]/
/functions/[page-x/]
.(peut poke vivre à QueryPosts )
Cela fonctionne et a l'air bien, mais j'ai enregistré certains cas où des personnes manipulent directement l'URL, comme:
/functions/[postname]
(en tapant le nom après la page d'archive)/function/
(effacer le nom de la fonction)Bien que ce ne soit pas compliqué à corriger explicitement avec du code, il y aurait plus de types de posts et il semble que les données et la logique suffisent amplement pour une solution générique (en fait, je m'attendais à ce que WP le gère, cela en fait beaucoup corriger les problèmes de lien).
Cependant, j'ai WP réécrivez profondément les traumatismes et je pourrais utiliser certains indicateurs. :)
Comment attraper et rediriger les URL correctes, autres que utilisant à tort archive slug au lieu de singulier et vice versa?
La configuration de l’archive est enregistrée comme ceci:
'has_archive' => 'functions',
'rewrite' => array(
'feeds' => false,
'with_front' => false,
),
'404_template'
. ( Exemple )has_archive
n'est pas FALSE
.has_archive
du type de publication et voyez si elle fait partie de l'URL de la demande actuelle.get_page_by_title()
avec la dernière partie des requêtes.wp_redirect()
sur le lien permanent de la publication trouvée.exit;
.Ok, j'y pensais probablement trop. Conformément à l'algorithme suggéré, mon gestionnaire a codé ceci jusqu'à présent:
/**
* Redirect manually edited URLs to proper pages.
*
* @param $template
*
* @return mixed
*/
static function if_404_template( $template ) {
$post_types = get_post_types( array( 'has_archive' => true, ), 'objects' );
$url_path = @parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
$url_path_parts = array_filter( explode( '/', $url_path ) );
if ( ! empty( $url_path_parts ) ) {
$last_url_path_part = end( $url_path_parts );
foreach ( $post_types as $name => $post_type_object ) {
if ( $name == $last_url_path_part ) {
wp_safe_redirect( get_post_type_archive_link( $name ), 301 );
die;
}
if ( count( $url_path_parts ) > 1 && in_array( $post_type_object->has_archive, $url_path_parts ) ) {
$post = get_page_by_title( $last_url_path_part, OBJECT, $name );
if ( ! empty( $post ) ) {
wp_safe_redirect( get_permalink( $post ), 301 );
die;
}
}
}
}
trigger_error( 'Uncaught 404 at ' . esc_html( $_SERVER['REQUEST_URI'] ) );
return $template;
}