2016-06-26 1 views
11

Cette fonction ajoute un onglet nommé « page spéciale » dans la liste de l'onglet « Mon compte »:WooCommerce: Attribution d'un point final à un modèle personnalisé dans mes pages de 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 attribuer cette URL à un fichier nommé ?

+0

est "spécial-page.php" une page de modèle de WooCommerce personnalisé qui se trouve dans votre thème actif> WooCommerce> mon dossier compte? – LoicTheAztec

+0

Oui c'est exactement :) –

Répondre

20

Enfin je pouvais résoudre le problème en utilisant un extrait provided for the same people of WooCommerce (Il y a plus de conseils dans cette page). Pour toute personne intéressée, coller 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('after_switch_theme', 'my_custom_flush_rewrite_rules'); 

Je pense que cette façon permet de mieux contrôler l'ordre/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 I inclus le fichier pour maintenir un certain "ordre", mais il admet également le code direct.

Veillez à 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, désactiver/réactiver le thème (pour les règles de réécriture flush).

Source: Tabbed My Account page

+0

travaillé uniquement dans localhost, maintenant je suis en train de tester ceci en ligne et les clients me forcent à faire fonctionner cela aujourd'hui! – Amine

+4

thx pour la solution. Astuce: Changez le hook "after_switch_theme" en un autre hook d'en-tête "wp_loaded" - par exemple. Et cela fonctionnera sans thèmes swithing. – WebArtisan

+0

Allez dans tableau de bord> Paramètres> Permaliens et cliquez sur "Enregistrer les paramètres" pourrait être plus facile pour vider les règles de réécriture. – optimiertes

4

Le premier my-account/special-page/ doit être myaccount/special-page/ dans woocommerce 2.6+.

Cette solution est incomplète et je travaille encore ...

Vous pouvez utiliser d'abord ce crochet:

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

filtrant ensuite wc_get_template pour appeler vos fichiers lorsque la demande correspondent à votre point final:

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

Si vous utilisez un thème enfant, remplacez get_template_directory() par get_stylesheet_directory() ... Collez ce code dans le fichier function.php de votre thème ou thème enfant actif.

Pour éviter une erreur 404 "page introuvable", vous devrez actualiser les règles de réécriture en ajoutant à votre code:

flush_rewrite_rules(); 

Mise à jour: Enfin Dario a trouvé un solution de travail. Regardez sa réponse.

Références:

+0

Salut. J'ai fait la même chose que dans la solution ci-dessus, mais je reçois une page non trouvée erreur 404. Y at-il quelque chose qui doit être mis à jour dans wordpress 4? –

+0

Les règles de réécriture de la page Permaliens n'ont pas aidé. Bien qu'ajouter flush_rewrite_rules(); dans le code a fait l'affaire. Merci pour votre suggestion –

+1

@AkashAgrawal Ok, j'ai ajouté ceci à la fin de cette réponse. Merci – LoicTheAztec