web-dev-qa-db-ja.com

WooCommerce:アカウントページのカスタムテンプレートにエンドポイントを割り当てる

この関数は、「特別ページ」という名前のタブを「マイアカウント」タブリストに追加します。

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

その結果、次のようになります。

enter image description here

しかし、リンクはmy-account/special-page/を指しており、当然404エラーが発生します。

このURLをspecial-page.phpという名前のファイルに割り当てるにはどうすればよいですか?

14
Dario Ferrer

最後に、WooCommerceの同じ人々に提供されたスニペット を使用して問題を解決できました (このページには他のヒントがあります)。興味のある方は、すべての次のコードを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' );

この方法により、メニューの順序/名前の変更をより細かく制御できると思います:

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

次の関数では、「順序」を維持するためにファイルをインクルードしましたが、直接コードも許可します。

special-page.phpファイルをmyaccountフォルダーに配置してください。

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

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

重要:これを行ったら、[ダッシュボード]> [設定]> [パーマリンク]に移動し、[設定を保存]をクリックして書き換えルールをフラッシュします(@optimiertesに感謝)

出典: Tabbed My Accountページ

22
Dario Ferrer

Woocommerce 2.6+では、最初の_my-account/special-page/_は_myaccount/special-page/_でなければなりません。

このソリューションは不完全であり、私はまだ取り組んでいます…

最初にこのフックを使用できます:

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

次に、_wc_get_template_をフィルタリングして、リクエストがエンドポイントに一致したときにファイルを呼び出します。

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

子テーマを使用する場合は、get_template_directory()get_stylesheet_directory()に置き換えてください...このコードをアクティブな子テーマまたはテーマのfunction.phpファイルに貼り付けます。

404エラー「ページが見つかりません」を回避するには、コードに追加する書き換えルールを更新する必要があります。

_flush_rewrite_rules();
_

更新:最後に Dario が有効なソリューションを見つけました。彼の答えを見てください。

参照:

4
LoicTheAztec

Woocommerceのカスタムページでテンプレートを使用するより良い方法があります。

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

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

これは、wc_get_templateフィルターを使用せずに機能するはずです。

0
masitko