it-swarm.com.de

WooCommerce: Zuweisen eines Endpunkts zu einer benutzerdefinierten Vorlage auf meinen Kontoseiten

Diese Funktion fügt der Registerkarte "Mein Konto" eine Registerkarte mit dem Namen "Spezielle Seite" hinzu:

add_filter( 'woocommerce_account_menu_items' , 'jc_menu_panel_nav' );

function jc_menu_panel_nav() {
    $items = array(
        'dashboard'       => __( 'Dashboard', 'woocommerce' ),
        'orders'          => __( 'Orders', 'woocommerce' ),
        'downloads'       => __( 'Downloads', 'woocommerce' ),
        'edit-address'    => __( 'Addresses', 'woocommerce' ),
        'payment-methods' => __( 'Payment Methods', 'woocommerce' ),
        'edit-account'    => __( 'Account Details', 'woocommerce' ),
        'special-page' => __( 'Special Page', 'woocommerce' ), // My custom tab here
        'customer-logout' => __( 'Logout', 'woocommerce' ),
    );

    return $items;
}

Das führt dazu:

 enter image description here

Aber der Link verweist auf my-account/special-page/ und gibt natürlich einen 404-Fehler.

Wie kann ich diese URL einer Datei mit dem Namen special-page.php zuweisen?

12
Dario Ferrer

Schließlich konnte ich das Problem mit einem Snippet lösen für die gleichen Leute von WooCommerce vorgesehen (Es gibt weitere Tipps auf dieser Seite). Fügen Sie für alle Interessierten den folgenden Code in functions.php ein:

function my_custom_endpoints() {
    add_rewrite_endpoint( 'special-page', EP_ROOT | EP_PAGES );
}

add_action( 'init', 'my_custom_endpoints' );

function my_custom_query_vars( $vars ) {
    $vars[] = 'special-page';

    return $vars;
}

add_filter( 'query_vars', 'my_custom_query_vars', 0 );

function my_custom_flush_rewrite_rules() {
    flush_rewrite_rules();
}

add_action( 'wp_loaded', 'my_custom_flush_rewrite_rules' );

Ich denke, auf diese Weise lässt sich das Menü besser steuern und umbenennen:

function my_custom_my_account_menu_items( $items ) {
    $items = array(
        'dashboard'         => __( 'Dashboard', 'woocommerce' ),
        'orders'            => __( 'Orders', 'woocommerce' ),
        //'downloads'       => __( 'Downloads', 'woocommerce' ),
        //'edit-address'    => __( 'Addresses', 'woocommerce' ),
        //'payment-methods' => __( 'Payment Methods', 'woocommerce' ),
        'edit-account'      => __( 'Edit Account', 'woocommerce' ),
        'special-page'      => 'Special Page',
        'customer-logout'   => __( 'Logout', 'woocommerce' ),
    );

    return $items;
}

add_filter( 'woocommerce_account_menu_items', 'my_custom_my_account_menu_items' );

In der folgenden Funktion habe ich die Datei eingefügt, um etwas "Ordnung" beizubehalten, aber sie gibt auch direkten Code frei.

Stellen Sie sicher, dass Sie die special-page.php-Datei im Ordner myaccount ablegen.

function my_custom_endpoint_content() {
    include 'woocommerce/myaccount/special-page.php'; 
}

add_action( 'woocommerce_account_special-page_endpoint', 'my_custom_endpoint_content' );

Important: Gehen Sie anschließend zu Dashboard> Einstellungen> Permalinks und klicken Sie auf "Einstellungen speichern", um die Regeln zum Überschreiben zu löschen (danke @optimiertes)

Quelle: Tabbed Mein Konto

21
Dario Ferrer

Zuerst sollte my-account/special-page/ in woocommerce 2.6+ myaccount/special-page/ sein.

Diese Lösung ist unvollständig und ich arbeite noch an…

Sie können zuerst diesen Haken verwenden:

add_action( 'init', 'add_wc_endpoint' );
function add_wc_endpoint(){
    add_rewrite_endpoint( 'special-page', EP_ROOT | EP_PAGES );
}

Dann filtern Sie wc_get_template, um Ihre Dateien aufzurufen, wenn die Anforderung Ihrem Endpunkt entspricht:

add_filter( 'wc_get_template', 'custom_vc_endpoint', 10, 5 );
function custom_vc_endpoint($located, $template_name, $args, $template_path, $default_path){

    if( $template_name == 'myaccount/special-page.php' ){
        global $wp_query;
        if(isset($wp_query->query['special-page'])){
            $located = get_template_directory() . '/woocommerce/myaccount/special-page.php';
        }
    }

    return $located;
}

Wenn Sie ein untergeordnetes Design verwenden, ersetzen Sie get_template_directory() durch get_stylesheet_directory()…. Fügen Sie diesen Code in die function.php-Datei Ihres aktiven untergeordneten Designs oder Designs ein.

Um einen 404-Fehler "Seite nicht gefunden" zu vermeiden, müssen Sie die Regeln zum Umschreiben aktualisieren, die Ihrem Code hinzugefügt werden:

flush_rewrite_rules();

Update: Schließlich hat Dario eine funktionierende Lösung gefunden. Schau dir seine Antwort an.

Verweise: 

4
LoicTheAztec

Es gibt eine bessere Möglichkeit, eine Vorlage auf Ihrer benutzerdefinierten Seite in woocommerce zu verwenden:

function my_custom_endpoint_content() {
    wc_get_template( 'myaccount/special-page.php' ); 
}

add_action( 'woocommerce_account_special-page_endpoint', 'my_custom_endpoint_content' );

dies sollte funktionieren, ohne den Filter wc_get_template zu verwenden.

0
masitko