web-dev-qa-db-fra.com

Règles de réécriture pour slug de type post personnalisé

Je suis perdu avec les règles de réécriture et j'ai besoin d'aide s'il vous plaît.

J'ai créé un type de produit personnalisé "produits" avec une méta "marque" personnalisée.

L’URL d’un produit appelé milk sera mysite.com/products/milk, j’ai besoin que l’URL comprenne la marque suivante, mysite.com/brand-brandname/milk

Quelques exemples: mysite.com/brand-supermilk/milk où "supermilk" est la marque dans la méta personnalisée du lait

mysite.com/brand-goodproducts/coffe où la marque est un bon produit

J'ai cette règle et réécris:

$args = array(
'rewrite' => array('slug' => 'brand-%brand_name%', 'with_front' => false),

);
register_post_type('products', $args);
function wptuts_custom_tags() {
add_rewrite_rule("^brand-([^/]+)?",'index.php?post_type=products&brand_name=$matches[1]','top');

flush_rewrite_rules();

}

add_action('init','wptuts_custom_tags');



 function my_post_type_link_filter_function($post_link, $id = 0, $leavename = FALSE) {
if (strpos('%brand_name%', $post_link) === FALSE) {
    $post = &get_post($id);
    $brand_name =get_post_meta($post->ID,'brand',true);

    if(empty($brand_name)){$brand_name = 'default';}
    $post_link = str_replace('%brand_name%',$brand_name, $post_link);

    return $post_link;


 }
}

add_filter('post_type_link', 'my_post_type_link_filter_function', 1, 3);

Tout cela me montre l'URL correcte dans l'administrateur lorsque j'ajoute une nouvelle publication de produit, mais me montre la liste des publications 404 ou des produits, mais pas la page du produit.

1
seelescript

WordPress semble incapable de générer les règles correctes lorsque vous utilisez des formats plus complexes pour l'argument slug dans register_post_type. Dans ce cas, nous devons utiliser add_permastruct .

Cet exemple ajoute le type de publication et des règles supplémentaires permettant d'activer des produits uniques et des archives de marque avec les URL correctes:

function wpd_products_post_type() {

    // post type args
    // rewrite and has_archive must be true!
    $args = array(
        'public' => true,
        'rewrite' => true,
        'has_archive' => true,
        'supports' => array( 'title', 'custom-fields' ),
    );

    register_post_type(
        'products',
        $args
    );

    // so WP will parse brand_name into query vars
    add_rewrite_tag(
        '%brand_name%',
        '([^&]+)'
    );

    // this sets the actual structure the post type will use
    add_permastruct(
        'products',
        'brand-%brand_name%/%products%',
        array( 'with_front' => false )
    );

    // to enable product archives by brand
    add_rewrite_rule(
        "^brand-([^/]+)?",
        'index.php?post_type=products&brand_name=$matches[1]',
        'top'
    );

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

Vous aurez toujours besoin de votre filtre post_type_link pour insérer la méta-valeur dans l'URL du produit au singulier.

Vous devrez également ajouter un filtre pre_get_posts pour les archives du produit, afin d'ajouter une méta requête pour votre brand_name.

Vous pouvez également ajouter un filtre pre_get_posts supplémentaire pour les produits singuliers à ajouter à la méta-requête, car vous pourriez découvrir que vous pouvez actuellement placer toute valeur souhaitée dans l'URL en tant que nom de marque. défaut.

4
Milo