Comment rediriger en toute transparence entre différentes archives et des slugs singuliers?

4

J'ai un CPT avec slug function (singulier) et archive slug functions (pluriel).

Structure permanente pour:

  • le singulier est /function/[postname]/
  • archive est /functions/[page-x/] .

(peut accéder en direct à QueryPosts )

Cela fonctionne et semble bien, mais j'ai enregistré certains cas où des personnes manipulent directement l'URL, par exemple:

  • /functions/[postname] (en tapant le nom après la page d'archive)
  • /function/ (effacement du nom de la fonction)

Bien que ce ne soit pas compliqué à corriger explicitement avec du code, il y aurait plus de types de messages 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 fait beaucoup corriger les problèmes de lien).

Cependant, j'ai une réécriture profonde des traumatismes par WP et je peux utiliser certains indicateurs. :)

En résumé:

  

Comment capturer et rediriger les URL correctes, à l'exception de l'utilisation incorrecte de l'archive slug au lieu du singulier et inversement?

La configuration de l’archive est enregistrée comme suit:

'has_archive' => 'functions',
'rewrite'     => array(
    'feeds'      => false,
    'with_front' => false,
),
    
posée Rarst 26.06.2012 - 13:56

2 réponses

4
  1. Accrochez-vous dans '404_template' . ( Exemple )
  2. Récupérer tous les types de publications publiques personnalisées , où has_archive n'est pas FALSE .
  3. Recherchez la chaîne has_archive du type de publication et voyez si elle fait partie de l'URL de la requête en cours.
  4. Essayez get_page_by_title() avec la dernière partie des demandes.
  5. wp_redirect() sur le lien permanent pour le message trouvé.
  6. exit; .
réponse donnée fuxia 26.06.2012 - 14:26
1

D'accord, 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;
}
    
réponse donnée Rarst 26.06.2012 - 15:20

Lire d'autres questions sur les étiquettes