私はWooCommerce用のプラグインを作成しています、それはこのhttp://domain/wp/shop/?param=value
のようなショップページのURLにパラメータを必要とします。ショップページをフロントページに設定するまではうまくいきました。http://domain/wp
にアクセスするとショップページが表示されますが、パラメータ(http://domain/wp/?param=value
)でアクセスするとブログのインデックスページが表示されます。
だから、私は正確にWooCommerceのショップページにURLをリダイレクトするWordpressのコードのどこに尋ねたいですか?だから私はリダイレクトの振る舞いや何か他のものを変更することができるかもしれません。
以下は関連するWooCommerceコードです。それはtemplate_redirect
WordPressフックにフックしています。ページIDがショップページとして設定したページと一致する場合、WordPressは商品の投稿タイプのアーカイブにリダイレクトします。
/**
* 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' );
書き換えルールを追加して、同じ機能を維持しながらURLの外観を改善できます。
例として:
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');
}
http://site/wp/shop/{somevalue}
にアクセスすると、URLの/shop/
部分を進める値が照合され、add_rewrite_tag
の使用を通じて登録されているクエリ変数param
に保存されます。 $matches[1]
変数は、式の最初に一致したグループの正規表現の値を保持します。http://site/wp/shop/discountproduct
は、param=discountproduct
の一部としてquery_vars
にアクセスすることでアクセスできます要求:
//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']
}
}
get_query_var('param')
を使用してクエリ変数を取得することもできます。
http://domain/wp/shop/value
が衝突するか、そのURLの深さで製品またはカテゴリまたは他のページと衝突する可能性がある場合、書き換えルールをもう少し拡張できます。
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');
}
もちろん、/get/
をあなたの言葉や文脈に合ったものに置き換えてください。
あなたもすることができます:
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');
}
便利なリンク: