web-dev-qa-db-fra.com

WooCommerce: attribution d'un noeud final à un modèle personnalisé dans les pages de mon compte

Cette fonction ajoute un onglet "Page spéciale" dans la liste de l'onglet "Mon compte":

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

Cela se traduit par ceci:

 enter image description here

Mais le lien pointe vers my-account/special-page/ et donne naturellement une erreur 404.

Comment puis-je affecter cette URL à un fichier nommé special-page.php?

12
Dario Ferrer

Enfin, je pourrais résoudre le problème en utilisant un extrait fourni aux mêmes personnes de WooCommerce (cette page contient d'autres astuces). Pour ceux qui sont intéressés, collez tout le code suivant dans functions.php:

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

Je pense que cette façon permet plus de contrôle pour commander/renommer le menu:

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

Dans la fonction suivante, j'ai inclus le fichier pour maintenir un "ordre", mais il admet également du code direct.

Assurez-vous de placer le fichier special-page.php dans le dossier myaccount.

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

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

Important: Une fois cela fait, allez dans Tableau de bord> Paramètres> Permaliens et cliquez sur "Enregistrer les paramètres" afin de vider les règles de réécriture (merci @optimiertes)

Source: Onglet Mon compte page

21
Dario Ferrer

Il existe un meilleur moyen d'utiliser un modèle dans votre page personnalisée dans woocommerce:

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

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

cela devrait fonctionner sans utiliser le filtre wc_get_template.

0
masitko