web-dev-qa-db-fra.com

Différences/problèmes entre types de publications et de publications personnalisées

J'ai commencé à remarquer des problèmes la semaine dernière lorsque la version 4.5 a été publiée et je croyais à tort que la mise à jour posait problème. En réalité, je l’ai remarqué pour la première fois parce que la semaine dernière était la première fois qu’un ensemble de conditions était créé. Fort de cette connaissance, je me demandais si quelqu'un pourrait m'aider à comprendre ce qui me manque alors que j'essaie de régler mon problème.

Pour l’arrière-plan, j’utilise un script PHP pour afficher les vignettes d’une galerie Coppermine, la pagination étant gérée à l’aide du paramètre mdgpage pour toutes les pages remplaçant la première (semblable au paramètre intégré page). Je l’utilise sur des pages de différentes profondeurs d’URL et je n’ai eu aucun problème depuis que je l’ai fait fonctionner. Pour une meilleure organisation, nous avons commencé à créer nos propres types d'articles personnalisés. Cela a bien fonctionné, mais la semaine dernière était la première fois qu'une galerie dans une entrée de type publication personnalisée justifiait plus d'une page et les pages de galerie suivantes 404.

La raison pour laquelle les pages et les types de publications personnalisées (et les publications standard bien que je ne prévoie pas d’utiliser de galeries dans ces publications) se comporte différemment dans ce sens. Vérifier les règles de réécriture et regex implique qu’il n’y a pas de différence. Voici ce que j'ai défini pour query_vars et rewrite_rules:

function add_query_vars($aVars) {
$aVars[] = "mdgpage"; // represents the name of the product category as shown in the URL
return $aVars;
}

// hook add_query_vars function into query_vars
add_filter('query_vars', 'add_query_vars');

function add_rewrite_rules($aRules) {
$aNewRules = array('(.?.+?)/mdgpage/([^/]+)/?$' => 'index.php?pagename=$matches[1]&mdgpage=$matches[2]');
$aRules = $aNewRules + $aRules;
return $aRules;
}

// hook add_rewrite_rules function into rewrite_rules_array
add_filter('rewrite_rules_array', 'add_rewrite_rules');

Voici également les déclarations du CPT que nous avons faites:

function md_custom_doujinshi_en() {
    $labels = array(
        'name'               => _x( 'Doujinshi (en)', 'post type general name' ),
        'singular_name'      => _x( 'Doujinshi (en)', 'post type singular name' ),
        'add_new'            => _x( 'Add Doujinshi (en)', 'Doujinshi (en)' ),
        'add_new_item'       => __( 'Add Doujinshi (en)' ),
        'edit_item'          => __( 'Edit Doujinshi' ),
        'new_item'           => __( 'New Doujinshi' ),
        'all_items'          => __( 'All Doujinshi (en)' ),
        'view_item'          => __( 'View Doujinshi' ),
        'search_items'       => __( 'Search Doujinshi' ),
        'not_found'          => __( 'No Doujinshi found' ),
        'not_found_in_trash' => __( 'No Doujinshi found in the Trash' ),
        'parent_item_colon'  => '',
        'menu_name'          => 'Doujinshi'
    );
    $args = array(
        'labels'                => $labels,
        'description'           => 'Miss Dream Doujinshi (en)',
        'public'                => true,
        'menu_position'         => 5,
        'supports'              => array( 'title', 'editor', 'thumbnail', 'comments' ),
        'has_archive'           => false,
        'register_meta_box_cb'  => 'md_doujinshi_metaboxes',
        'rewrite'               => array('slug' => 'sailor-moon-doujinshi')
    );
    register_post_type('doujinshi_en', $args); 
}
add_action('init', 'md_custom_doujinshi_en');

function md_custom_doujinshi_jp() {
  $labels = array(
    'name'               => _x( 'Doujinshi (jp)', 'post type general name' ),
    'singular_name'      => _x( 'Doujinshi (jp)', 'post type singular name' ),
    'add_new'            => _x( 'Add Doujinshi (jp)', 'Doujinshi (jp)' ),
    'add_new_item'       => __( 'Add Doujinshi' ),
    'edit_item'          => __( 'Edit Doujinshi' ),
    'new_item'           => __( 'New Doujinshi' ),
    'all_items'          => __( 'All Doujinshi (jp)' ),
    'view_item'          => __( 'View Doujinshi' ),
    'search_items'       => __( 'Search Doujinshi' ),
    'not_found'          => __( 'No Doujinshi found' ),
    'not_found_in_trash' => __( 'No Doujinshi found in the Trash' ),
    'parent_item_colon'  => ''
  );
  $args = array(
    'labels'            => $labels,
    'description'       => 'Miss Dream Doujinshi (jp)',
    'public'            => true,
    'show_ui'           => true,
    'show_in_menu'      => 'edit.php?post_type=doujinshi_en',
    'supports'          => array( 'title', 'editor', 'thumbnail', 'comments' ),
    'has_archive'       => false,
    'register_meta_box_cb'  => 'md_doujinshi_metaboxes',
    'rewrite'         => array('slug' => 'raw-sailor-moon-doujinshi')
  );
  register_post_type('doujinshi_jp', $args);  
}
add_action('init', 'md_custom_doujinshi_jp');

Dans les deux pages et les types de publication personnalisés, le script de galerie est configuré pour s'exécuter et s'afficher au milieu du contenu. J'utilise un plugin pour pouvoir définir la aid et inclure le script dans les pages. Pour le type de publication personnalisé, les mêmes lignes sont codées dans les modèles de page dans lesquels la variable aid est définie dans l'un des champs postmeta.

Toute aide ou conseil pour me mettre dans la bonne direction serait grandement apprécié. Je vous remercie!

1
MarioKnight

Votre règle ne fonctionne pas pour les types de publication personnalisés, car pagename est la requête var propre au type de publication page. Vos vars de requête CPT sont les slugs avec lesquels vous les avez enregistrés, doujinshi_en et doujinshi_jp.

Vous pourrez peut-être résoudre ce problème en ajoutant des types de publication supplémentaires via pre_get_posts :

function wpd_add_custom_types( $query ){
    if( $query->is_main_query() && isset( $query->query_vars['mdgpage'] ) ){
        $query->set( 'post_type', array( 'page', 'doujinshi_en', 'doujinshi_jp' ) );
    }
}
add_action( 'pre_get_posts', 'wpd_add_custom_types' );

Mais cela se cassera si différents types de publication partagent le même slug.

Cependant, pour vos besoins, vous devriez envisager d'utiliser add_rewrite_endpoint à la place, qui se chargera de générer les règles appropriées pour vous.

function wpd_add_endpoint(){
    add_rewrite_endpoint( 'mdgpage', EP_PERMALINK | EP_PAGES );
}
add_action( 'init', 'wpd_add_endpoint' );
1
Milo