web-dev-qa-db-fra.com

Comment rediriger de façon transparente entre différentes limites d'archives et singulières?

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 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. :)

Résumer:

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,
),
4
Rarst
  1. Accrocher dans '404_template'. ( Exemple )
  2. Extrait tous les types de publication personnalisés publicshas_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 demande actuelle.
  4. Essayez get_page_by_title() avec la dernière partie des requêtes.
  5. wp_redirect() sur le lien permanent de la publication trouvée.
  6. exit;.
4
fuxia

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