web-dev-qa-db-fra.com

URL de type de publication personnalisée avec ID de publication permettant l'archivage et la pagination

J'ai de la difficulté à faire en sorte que les URL de mes types de publication personnalisés fonctionnent correctement. Chaque solution que je trouve a paralysé une autre partie qui doit fonctionner. Ce que j'essaie d'accomplir, c'est domain.com/post_type/post_id/post_name.

Ce que j'ai qui fonctionne pour tout sauf les archives est:

register_post_type('post-type',
    array(
    'rewrite' => array(
    'slug' => 'post-type/%post_id%',
    'with_front' => false,
    'pages' => true,
    'ep_mask' => 1 
    )
))

Ensuite j'ai:

add_filter('post_type_link', 'custom_post_type_link', 1, 3);
function custom_post_type_link($post_link, $post = 0, $leavename = false) {

    if ($post->post_type == 'post-type')) {
        return str_replace('%post_id%', $post->ID, $post_link);
    } else {
        return $post_link;
    }
}

J'essaie donc de trouver un moyen de faire fonctionner domain.com/post_type. Il jette actuellement un 404.

Je sais que si je supprime le filtre et le /%post_id% de ma réécriture, l’archive fonctionnera. A partir de là, j'ai essayé d'ajouter une règle de réécriture:

add_action( 'init', 'custom_rewrites_init' );
function custom_rewrites_init(){
    add_rewrite_rule(
        'post-type/([0-9]+)?$',
        'index.php?post_type=post-type&p=$matches[1]',
        'top' );
}

En procédant ainsi, l'URL ne sera pas redirigé si quelqu'un saisit domain.com/post_type/post_id et domain.com/post_type/post_id/post_name/2 ne fonctionne pas.

Quelqu'un sait-il quel est le meilleur moyen de le faire?

3
kel

Votre code/solutions est très bon. Vous utilisez slug param de manière très intelligente, donc WordPress crée automatiquement permastruct correct pour ce CPT.

La seule chose qui vous manque, je suppose, est has_archive param. Sa valeur par défaut est false et vous ne le définissez pas sur true. Donc, WordPress ne crée pas de liens/pages d’archives pour votre CPT.

has_archive (boolean ou string)

(facultatif) Active les archives de type publication.

Utilisera $ post_type comme archive slug par défaut. Valeur par défaut: false Remarque: Générera les règles de réécriture appropriées si la réécriture est activée. Utilisez également rewrite pour changer le slug utilisé.

Si vous faites cela, WordPress créera des règles de réécriture pour les pages d'archives. Il y aura un petit problème. Ils contiendront %post_id% en eux. Mais c'est assez facile à corriger. Vous devez juste ajouter ce code après votre appel register_post_type:

global $wp_rewrite;

$new_rules = array();
foreach ( $wp_rewrite->extra_rules_top as $key => $rule ) {
    echo $key;
    if (strpos($key, 'post-type/%post_id%/') === 0 ) {
        $new_rules[ str_replace('%post_id%/', '', $key) ] = $rule;
        unset( $wp_rewrite->extra_rules_top[$key] );
    }
}
$wp_rewrite->extra_rules_top = $wp_rewrite->extra_rules_top + $new_rules;

Il réparera les règles pour les pages d'archives créées par WordPress. C'est une solution propre - elle ne laisse pas de dégâts, et prend en charge toutes les règles de la page d'archivage (flux, etc.)

6
Krzysiek Dróżdż

Vous pouvez essayer d'ajouter cet extrait de code:

add_filter( 'rewrite_rules_array', 'custom_rewrite_rules_array' );
function custom_rewrite_rules_array( $rules ) {
        $newrules = array();
        $newrules['^post-type/page/?([0-9]{1,})/?$'] = 'index.php?post_type=post-type&paged=$matches[1]';
        $newrules['^post-type$'] = 'index.php?post_type=post-type';
       return $newrules + $rules;
}

ajouter un support pour domain.com/post-type/ et domain.com/post-type/page/2.

Vous devez juste vous rappeler de sauvegarder les permaliens.

2
birgire

Avez-vous réinitialisé vos paramètres de permalien après avoir enregistré le fichier de modèle? Avant de pouvoir utiliser un nouveau permalien comme celui-ci, vous devez réenregistrer vos paramètres de permalien dans Paramètres-> Permaliens.

0
Chris Wiegman