web-dev-qa-db-fra.com

Permaliens pour qu'un type de message personnalisé semble être un enfant d'un autre, ne fonctionne pas

Actuellement, j'ai deux types de messages, "produits" et "produits-données". Ce sont des types de messages distincts; Cependant, à toutes fins utiles, produits-données est une publication enfantine de produits. La relation est établie via un méta-élément pour les produits-données "parent" qui auront un ID de publication de produit.

Les articles "produits-données" ne sont créés que dans un seul sens: un utilisateur clique sur un produit dans le type d'article et insère les données dans une fenêtre contextuelle. Ceci utilise wp_insert_post pour créer une publication data-products et ajoute un méta-élément "parent" avec la valeur de l'ID de la publication "products". Ces données sont affichées via une fenêtre modale si un utilisateur clique sur le type de produit.

J'essaie d'avoir leurs permaliens comme suit:

Schéma Permalink pour un article "produits" (pour cet exemple, l'identifiant de cet article est 123):

http://example.com/products/new-product-1/

Schéma Permalink pour une publication "products-data" ayant une méta clé/valeur de parent => 123

http://example.com/products/new-product-1/information-product-data/

Voici le code que j'utilise pour enregistrer le type de message et créer des règles de réécriture; cependant, après avoir ajouté ce code et effacé mes règles de réécriture (settings> permalink), cela fonctionne très bien pour un type de publication "products-data" MAIS lorsque j'essaie d'accéder à un "produit", il affiche la page d'accueil du site WordPress (NB this n’est pas redirigé, la barre d’URL affiche l’URL "produits").

Je me demande si le problème réside dans le fait que les deux permastructure semblent pouvoir se heurter, mais il n’y aura jamais d’exemple en pratique en raison du schéma de permastructure.

Toute aide serait grandement appréciée pour résoudre ce problème.

Code:

add_action ( 'init', 'register_product_post_types' );
add_action ( 'init', 'products_add_rewrite_rules' );
add_filter ( 'post_type_link', 'products_permalinks', 10, 3 );

function register_product_post_types() {    
    register_post_type( 'products',
        array(
                'supports' => array( 'title', 'editor', 'author',"custom-fields", "thumbnail", "excerpt", 'comments' ),
                'labels' => array(
                'name' => __( 'Products' ),
                'singular_name' => __( 'Products' )
            ),
        'public' => true,
        'has_archive' => false,
        'rewrite' => FALSE,
        )
    );

    register_post_type( 'products-data',
        array(
                'supports' => array( 'title', 'editor', 'author',"custom-fields" ),
                'labels' => array(
                'name' => __( 'Products-Data' ),
                'singular_name' => __( 'Products-Data' )
            ),
        'show_in_menu' =>'edit.php?post_type=products',
        'public' => true,
        'has_archive' => false,
        'rewrite' => FALSE,
        )
    );
}


function products_add_rewrite_rules() {
    global $wp_rewrite;
    $wp_rewrite->add_rewrite_tag('%products%', '([^/]+)', 'products=');
    $wp_rewrite->add_rewrite_tag('%products-data%', '([^/]+)', 'products-data=');
    $wp_rewrite->add_rewrite_tag('%parent%', '([^/]+)', 'parent=');
    $wp_rewrite->add_permastruct('products-data', '/products/%parent%/%products-data%', false);

}

function products_permalinks($permalink, $post, $leavename) {
    $no_data = 'no-data';
    $post_id = $post->ID;
    if($post->post_type != 'products-data' || empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft')))
        return $permalink;
    $data = sanitize_title(get_the_title(get_post_meta($post_id, 'parent', true)));
    if(!$data) $data = $no_data;
    $permalink = str_replace('%parent%', $data, $permalink);
    return $permalink;
}
4
setterGetter

Voir ma réponse ici: https://wordpress.stackexchange.com/a/100486/12324 .

Le problème que vous rencontrez est que permastructs ajoute plusieurs types de publication personnalisés à l’URL, ce qui crée de la confusion pour WordPress. Vous devrez ajouter vos règles de réécriture à l'aide de add_rewrite_rule().

1
Matthew Boynes