it-swarm.com.de

Wie geht Wordpress zur WooCommerce-Shop-Seite weiter?

Ich erstelle ein Plugin für WooCommerce, es benötigt einen Parameter in der URL der Shop-Seite wie diesen http://domain/wp/shop/?param=value. Es hat einwandfrei funktioniert, bis ich die Shop-Seite als Startseite festgelegt habe, wenn ich auf http://domain/wp zugreife, wird die Shop-Seite angezeigt, aber wenn ich mit dem Parameter (http://domain/wp/?param=value) darauf zugreife, wird die Blog-Index-Seite angezeigt.

Also, ich möchte fragen, wo genau im Wordpress-Code, der die URL auf die WooCommerce-Shop-Seite umleitet? Daher kann ich möglicherweise das Umleitungsverhalten oder etwas anderes ändern.

2
xdim222

Das Folgende ist der relevante WooCommerce-Code. Es wird in den template_redirect WordPress-Hook eingebunden. Wenn die Seiten-ID mit der Seite übereinstimmt, die Sie als Shop-Seite festgelegt haben, leitet WordPress zum Archiv für Produktbeitragstypen weiter.

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

Sie können eine Umschreiberegel hinzufügen, um das Erscheinungsbild der URL bei gleicher Funktionalität zu verbessern:

Als Beispiel:

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');
}

Wenn Sie http://site/wp/shop/{somevalue} aufrufen, wird der Wert, der dem /shop/-Teil der URL folgt, abgeglichen und in der Abfrage var param gespeichert, die unter Verwendung von add_rewrite_tag registriert ist. Die Variable $matches[1] enthält den Wert der Regex für die erste übereinstimmende Gruppe Ihres Ausdrucks , http://site/wp/shop/discountproduct würde param=discountproduct entsprechen, auf den über den Zugriff auf den query_vars als Teil der Anforderung zugegriffen werden kann:

//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']
    }
}

Sie können auch get_query_var('param') verwenden, um Abfragevariablen abzurufen.

Wenn http://domain/wp/shop/value mit Produkten, Kategorien oder anderen Seiten in dieser URL-Tiefe in Konflikt gerät oder möglicherweise in Konflikt gerät, können Sie die Umschreiberegel ein wenig weiter ausdehnen:

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');
}

Ersetzen Sie /get/ natürlich durch das, was auch immer zu Ihrer Ausdrucksweise oder Ihrem Kontext passt.

Sie können sogar tun:

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');
}

Nützliche Links:

1
userabuser