WordPress如何重定向到WooCommerce商店页面?

时间:2014-06-22 作者:xdim222

我正在为WooCommerce创建一个插件,它需要在商店页面的url中设置一个参数,如下所示http://domain/wp/shop/?param=value. 它工作得很好,直到我将商店页面设置为头版,当我访问http://domain/wp, 它显示了shop页面,但当我使用参数访问它时(http://domain/wp/?param=value), 它显示了博客索引页面。

所以,我想问一下将url重定向到WooCommerce商店页面的Wordpress代码中的确切位置?因此,我可以更改重定向行为或其他内容。

2 个回复
SO网友:Adam

您可以添加重写规则以改进URL的外观,同时保持相同的功能:

例如:

add_action(\'init\', \'custom_shop_param\');

function custom_shop_param() {
    add_rewrite_tag(\'%param%\',\'([^&]+)\');
    add_rewrite_rule(\'^shop/([^/]+)/?$\',\'index.php?page=shop&param=$matches[1]\',\'top\');
}
当您访问时http://site/wp/shop/{somevalue} 进行以下操作的值/shop/ URL的一部分将被匹配并存储在查询变量中param 通过使用add_rewrite_tag, 这个$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&param=$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&param=$matches[1]\',\'top\');
}
有用的链接:

SO网友:helgatheviking

以下是相关的WooCommerce代码。它与template_redirect WordPress挂钩。如果页面id与您设置为商店页面的页面相匹配,WordPress将重定向到product post type存档。

/**
 * 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\' );

结束

相关推荐

HTML Redirect to WP pages

我有一些预定义的链接,需要重定向到WP安装中的真实URL。不幸的是,我别无选择,只能使用提供给我的这些URL。格式为:http://mysite.com/redirect.html?p=pagenameWP安装在mysite的根目录下。com。我需要获取pagename查询变量,它不会与页面URL直接匹配,并将其重定向(301)到WP permalink。我尝试了几件事。htaccess具有重写功能,但运气不佳,这主要是因为还有WP permalinks重定向。有人以前做过这件事,或者知道最好的方法吗?更