web-dev-qa-db-fra.com

Post personnalisé de type 404 avec réécriture, même après la réinitialisation des liens permanents

J'ai créé un type d'article personnalisé, dont les arguments (simplifiés) sont:

register_post_type(
    'Event',
    'public' => true,
    'rewrite' => array( 'slug' => 'eventy'),
    'has_archive' => false,
    'hierarchical' => false
)

Cela fonctionne bien en général. Cependant, si j'essaie de réécrire les URL dans functions.php, par exemple:

function my_post_type_link_filter_function( $post_link, $id = 0, $leavename = FALSE ) {
   return str_replace('eventy', 'eventx', $post_link);
}
add_filter('post_type_link', 'my_post_type_link_filter_function', 1, 3);

Le résultat est que les nouvelles URL 'eventx' apparaissent correctement dans les liens, les listes, etc., générés par WordPress. Mais quand je vais à ces URL 'eventx', je reçois un 404. Aller à une URL 'eventy' fonctionne toujours.

J'ai essayé de changer les paramètres de permaliens par défaut et de revenir au nom du post, plusieurs fois. Cela est supposé réinitialiser les liens permanents et résoudre ce problème pour beaucoup de gens que j'ai vus en ligne. Pas pour moi.

Quelqu'un sait ce que la cause pourrait être? Comment puis-je résoudre ce problème? Je suis faible sur la théorie de la réécriture d'URL.

Si vous êtes intéressé, mon but n'est pas la substitution triviale eventy → eventx mentionnée ci-dessus. En fait, je veux glisser dans l'année/le mois où un événement commence (pas quand il a été publié) dans son URL. Le débogage m'a fait comprendre que j'avais un problème plus fondamental, car même cette réécriture triviale x → y jette toujours des 404.

Merci d'avoir lu!

[clarification ajoutée]

Pour le moment, j'ai dit trois événements (messages dans mon type de message personnalisé) appelé "voyage de pêche". Ceux-ci sont assignés par défaut comme des permaliens comme

  • mysite.com/events/fishing-trip
  • mysite.com/events/fishing-trip-2
  • mysite.com/events/fishing-trip-3

Ce qui est ennuyeux et inélégant.

Je veux la place

  • mysite.com/events/2013/january/fishing-trip
  • mysite.com/events/2013/may/fishing-trip
  • mysite.com/events/2013/may/fishing-trip-2
  • mysite.com/events/2014/march/fishing-trip

Plus joli et plus informatif.

Je ne suis pas intéressé à avoir des pages de style comme

  • mysite.com/events/2013

L'année et le mois sont simplement cosmétiques dans l'URL.

7
Jonathan

Étape 1, ajoutez les balises de réécriture pour les vars de requête d'année et de mois de l'événement personnalisé, puis enregistrez le type de publication d'événement avec ces balises dans l'argument slug de l'argument de réécriture:

function wpa83531_register_event_post_type(){

    add_rewrite_tag('%event_year%','(\d+)');
    add_rewrite_tag('%event_month%','(.+)');

    register_post_type( 'event',
        array(
            'public' => true,
            'rewrite' => array( 'slug' => 'events/%event_year%/%event_month%' ),
            'has_archive' => false,
            'hierarchical' => false,
            'supports' => array('custom-fields', 'title', 'editor')
        )
    );

}
add_action( 'init', 'wpa83531_register_event_post_type' );

Étape 2, filtrez le lien de type de publication pour remplacer ces balises par les valeurs des champs personnalisés event_year et event_month. Si les champs personnalisés n'existent pas, certaines valeurs par défaut sont insérées afin que vous puissiez au moins prévisualiser une publication sans erreur:

function wpa83531_event_post_link( $permalink, $post, $leavename ) {
    if ( stripos( $permalink, '%event_year%' ) == false )
        return $permalink;

    if ( is_object( $post ) && 'event' == $post->post_type ) {

        $default_year = '1970';
        $default_month = 'january';

        if( $event_year = get_post_meta( $post->ID, 'event_year', true ) ){
            $permalink = str_replace( '%event_year%', $event_year, $permalink );
        } else {
            $permalink = str_replace( '%event_year%', $default_year, $permalink );
        }

        if( $event_month = get_post_meta( $post->ID, 'event_month', true ) ){
            $permalink = str_replace( '%event_month%', $event_month, $permalink );
        } else {
            $permalink = str_replace( '%event_month%', $default_month, $permalink );
        }

    }

    return $permalink;
}

add_filter( 'post_type_link', 'wpa83531_event_post_link', 10, 3 );
8
Milo

Vous devez définir 'rewrite' => false dans votre register_post_type (); et ajoutez après la fermeture de register_post_type ():

// 404 CPT WP bug...

global $wp_rewrite;
$projet_structure = '/projets/%projet%';
$wp_rewrite->add_rewrite_tag("%projet%", '([^/]+)', "projet=");
$wp_rewrite->add_permastruct('projet', $projet_structure, false);

projet est mon CPT.

Vous pouvez vérifier ici pour plus.

0
Alex