Je crée un plugin pour WooCommerce, il a besoin d'un paramètre dans l'URL de la page de la boutique, comme ceci http://domain/wp/shop/?param=value
. Cela a fonctionné correctement jusqu'à ce que je définisse la page de boutique comme page de couverture. Lorsque j'accède à http://domain/wp
, la page de boutique est affichée, mais lorsque j'y accède avec le paramètre (http://domain/wp/?param=value
), la page d'index du blog s'affiche.
Donc, je veux demander où exactement dans le code Wordpress qui redirige l'URL vers la page de la boutique WooCommerce? je peux donc peut-être changer le comportement de redirection ou autre chose.
Ce qui suit est le code WooCommerce approprié. Il s’accroche au template_redirect
hook de WordPress. Si l'ID de la page correspond à la page que vous avez définie comme page de magasin, WordPress sera redirigé vers l'archive de type de publication de produit.
/**
* Handle redirects before content is output - hooked into template_redirect so is_page works.
*
* @return void
*/
function wc_template_redirect() {
global $wp_query, $wp;
// When default permalinks are enabled, redirect shop page to post type archive url
if ( ! empty( $_GET['page_id'] ) && get_option( 'permalink_structure' ) == "" && $_GET['page_id'] == wc_get_page_id( 'shop' ) ) {
wp_safe_redirect( get_post_type_archive_link('product') );
exit;
}
// When on the checkout with an empty cart, redirect to cart page
elseif ( is_page( wc_get_page_id( 'checkout' ) ) && sizeof( WC()->cart->get_cart() ) == 0 && empty( $wp->query_vars['order-pay'] ) && ! isset( $wp->query_vars['order-received'] ) ) {
wp_redirect( get_permalink( wc_get_page_id( 'cart' ) ) );
exit;
}
// Logout
elseif ( isset( $wp->query_vars['customer-logout'] ) ) {
wp_redirect( str_replace( '&', '&', wp_logout_url( get_permalink( wc_get_page_id( 'myaccount' ) ) ) ) );
exit;
}
// Redirect to the product page if we have a single product
elseif ( is_search() && is_post_type_archive( 'product' ) && apply_filters( 'woocommerce_redirect_single_search_result', true ) && $wp_query->post_count == 1 ) {
$product = get_product( $wp_query->post );
if ( $product->is_visible() ) {
wp_safe_redirect( get_permalink( $product->id ), 302 );
exit;
}
}
// Ensure payment gateways are loaded early
elseif ( is_add_payment_method_page() ) {
WC()->payment_gateways();
}
// Checkout pages handling
elseif ( is_checkout() ) {
// Buffer the checkout page
ob_start();
// Ensure gateways and shipping methods are loaded early
WC()->payment_gateways();
WC()->shipping();
}
}
add_action( 'template_redirect', 'wc_template_redirect' );
Vous pouvez ajouter une règle de réécriture pour améliorer l'apparence de l'URL tout en conservant les mêmes fonctionnalités:
Par exemple:
add_action('init', 'custom_shop_param');
function custom_shop_param() {
add_rewrite_tag('%param%','([^&]+)');
add_rewrite_rule('^shop/([^/]+)/?$','index.php?page=shop¶m=$matches[1]','top');
}
Lorsque vous visitez http://site/wp/shop/{somevalue}
, la valeur correspondant à la partie /shop/
de l'URL est comparée et stockée dans la requête var param
qui est enregistrée lors de l'utilisation de add_rewrite_tag
, la variable $matches[1]
contient la valeur de l'expression régulière du premier groupe correspondant de votre expression. , http://site/wp/shop/discountproduct
équivaudrait à param=discountproduct
pour lequel est accessible en accédant au query_vars
dans le cadre de la demande:
//somewhere in your code....
function parse_shop_request() {
global $wp_query;
if ( isset($wp_query->query_vars['param']) ) {
//do something with $wp_query->query_vars['param']
}
}
Vous pouvez également utiliser get_query_var('param')
pour récupérer des variables de requête.
Si http://domain/wp/shop/value
est en conflit ou risque de l'être avec des produits, des catégories ou d'autres pages à cette profondeur d'URL, vous pouvez étendre un peu plus la règle de réécriture:
http://site/wp/shop/get/value
add_action('init', 'custom_shop_param');
function custom_shop_param() {
add_rewrite_tag('%param%','([^&]+)');
add_rewrite_rule('^shop/get/([^/]+)/?$','index.php?page=shop¶m=$matches[1]','top');
}
Bien sûr, remplacez /get/
par tout ce qui convient à votre verbiage ou à votre contexte.
Vous pouvez même faire:
add_action('init', 'custom_shop_param');
function custom_shop_param() {
add_rewrite_tag('%param%','([^&]+)');
add_rewrite_rule('^shop/?param=([^/]+)$','index.php?page=shop¶m=$matches[1]','top');
}
Liens utiles: