web-dev-qa-db-fra.com

Comment réécrire correctement l'URL par var personnalisé

J'ai essayé de réécrire un magasin URI, et ce que j'ai maintenant est ce code:

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('wp_loaded','flushRules');  

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules) {
    $newrules = array();
    $newrules['shop/brand/(brand)/?$'] = 'shop.php?brand=$matches[1]' ; 
     //$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
     return $newrules + $rules ;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars) {
    array_Push($vars, 'brand');
    return $vars;
}

mais peu importe ce que je fais, je ne peux pas faire en sorte que cela fonctionne. J'utilise le plug-in Monkeyman Rewrite Analyzer pour afficher les réécritures actives des ap et cela me dit que la marque "n'est pas publique et ne sera pas enregistrée". De plus, cela change mon shop.php en shop_php ...

shop/brand/(brand)/?$    shop_php?brand: (brand)

Pourquoi est-ce un tel gâchis? J'ai essayé de modifier .htaccess le moins possible; aussi, puisque je veux que cela soit dans le thème.

1
Adeerlike

Donc, pour commencer, ne jamais vider les règles de réécriture à chaque chargement de page. Mieux vaut le faire lors de l'activation du plugin une fois.

Étape 1: ajoutez la règle de réécriture:

add_action( 'init', 'wpse26555_add_rewrite' );
function wpse26555_add_rewrite()
{
    // You should probably rewrite to index.php instead of shop.php?
    add_rewrite_rule( '/shop/brand/([^/]+)/?$', 'index.php?brand=$matches[1]', 'top' );
}

Étape 2: ajoutez la requête var

add_filter( 'query_vars', 'wpse26555_add_vars' );
function wpse26555_add_vars( $vars )
{
    $vars[] = 'brand';
    return $vars;
}

Puis affinez l'activation du plugin (car quelque chose comme cela devrait probablement être dans un fichier de plugin).

<?php    
// Somewhere in your plugin's main file    
register_activation_hook( __FILE__, 'wpse26555_activation' );
function wpse26555_activation()
{
        // Add the rule first
        wpse26555_add_rewrite();
        // Then flush rewrite rules
        flush_rewrite_rules();
}

Ensuite, au début, vous pouvez faire quelque chose comme ceci:

if( $brand = get_query_var( 'brand' ) )
{
    // Do stuff with $brand here

}

Peut-être qu'une meilleure stratégie serait de réécrire la marque sur une page spécifique? Ou peut-être que la marque pourrait être une sorte de taxonomie personnalisée?

Vous devrez tester le code ci-dessus, c'était une idée en tête, mais cela devrait fonctionner ou au moins vous aider à démarrer

6
chrisguitarguy

la réponse principale fonctionne, mais il existe une manière plus appropriée et officielle de faire ce type de réécriture ...

par exemple, le code suivant enregistrera votre variable de requête personnalisée et votre règle de réécriture à partir de la même action:

function include_cpt_rewrites(){
  add_rewrite_tag('%brand%', '([a-zA-Z0-9-]+)');

  add_rewrite_rule('^shop/brand/([^/]+)/?$', 'index.php?brand=$matches[1]', 'top');
}
add_action('init', 'include_cpt_rewrites');

la dernière étape de vidage des permaliens peut être effectuée manuellement à partir de WP admin au lieu de le faire par code en allant à settings/permalinks et en appuyant sur save changes.

add_rewrite_tags / add_rewrite_rule

0
eballeste

merci pour la longue réponse. Le problème, c’est que je ne crée pas de plugin ici, j’essaie simplement d’interagir avec un autre. c'est un plugin de boutique [theCartPress], et j'ai créé mon propre design tout autour, et une page shop.php pour un type de message personnalisé de ce type [tcp_product].

tous les messages de ce type de message sont redirigés vers le bon fichier, mais je souhaite également pouvoir les afficher par marque. J'ai un peu de _GET afin que je puisse faire? marque = mon marque, mais je veux utiliser les permaliens wordpress. J'ai en fait une taxonomie personnalisée pour cela. C'est ce que j'utilise après mon GET:

 if (($_GET['brand'] == 'owl') || !isset($_GET['brand'])) {
    $brand = 'owl';
  } else {
    $brand = $_GET['brand'];
  }
  $args = array( 'post_type' => 'tcp_product', 'posts_per_page' => 30, 'tax_query' => array(
    array('taxonomy' => 'tcp_product_supplier', 'field' => 'slug', 'terms' => $brand)));

$loop = new WP_Query( $args );

désolé pour les mods qui ont utilisé la réponse, mais le reformatage des commentaires est impossible ..

0
Adeerlike