Woocommerce 如何在我的帐户页面上重定向自定义端点

Posted

技术标签:

【中文标题】Woocommerce 如何在我的帐户页面上重定向自定义端点【英文标题】:Woocommerce how to redirect a custom end point on my-account page 【发布时间】:2022-01-20 12:46:39 【问题描述】:

这是我上一个问题的继续

Woocommerce how to exclude the child pages (endpoints) of myaccount from the template redirect hook?

登录注册表单只能像弹出窗口一样显示,所以我进行了重定向,以避免未登录用户的默认我的帐户页面。 我使用该代码从我的帐户页面本身进行重定向,并从该规则中排除“丢失密码”,以便未登录的用户可以更新他们的密码。

add_action( 'template_redirect', 'wish_custom_redirect' );

function wish_custom_redirect() 
  global $wp;

  if (
        !is_user_logged_in() 
        &&
        ('my-account' == $wp->request)
        &&
        ('lost-password' != $wp->request)
     ) 
  
    wp_redirect( home_url() );
    exit;
  

add_action('wp_logout','auto_redirect_after_logout');

function auto_redirect_after_logout()

  wp_redirect( home_url() );
  exit();

但它不适用于 myaccount 中的自定义端点选项卡。如果用户注销,他们可以返回上一页并看到标准登录表单页面,该页面必须被隐藏。 我是如何创建这个端点的。比如一个,其他的也是用同样的方法制作的。

/**
 * 1. Register new endpoint slug to use for My Account page
 */

/**
 * @important-note  Resave Permalinks or it will give 404 error
 */
function ts_custom_add_my_returns_endpoint() 
    add_rewrite_endpoint( 'my_returns', EP_ROOT | EP_PAGES );

  
add_action( 'init', 'ts_custom_add_my_returns_endpoint' );
  
  
/**
 * 2. Add new query var
 */
  
function ts_custom_my_returns_query_vars( $vars ) 
    $vars[] = 'my_returns';
    return $vars;

  
add_filter( 'woocommerce_get_query_vars', 'ts_custom_my_returns_query_vars', 0 );
  
  
/**
 * 3. Insert the new endpoint into the My Account menu
 */
  
function ts_custom_add_my_returns_link_my_account( $items ) 
    $items['my_returns'] = 'My returns';
    return $items;

  
add_filter( 'woocommerce_account_menu_items', 'ts_custom_add_my_returns_link_my_account' );
  
  
/**
 * 4. Add content to the new endpoint
 */
  
function ts_custom_my_returns_content() ?>
       <h2 class="text-center woocommerce-products-header__title page-title need-title"><?php echo get_theme_mod('my_returns_tab_heading') ?></h2>
    <section class="order">     
<?php 
$orders = wc_get_orders( array(
  'numberposts' => -1,  
   'orderby' => 'date',
   'order' => 'DESC',  
   'customer_id' => get_current_user_id(),
   'status' => array('refunded','cancelled'),
) );



//* Loop through each WC_Order object
foreach( $orders as $order )?>
    <div class="order-wrapper product d-flex col-12">
        <?php 
        $order_data = $order->get_data(); // The Order data
        $order_id = $order_data['id'];
        $order_currency = $order_data['currency'];
        $order_status = $order_data['status'];        
         ?>
        <div class="order-number">#<?php echo  $order_id;?></div>         
        <div class="order-inner">
            <div class="order-inner-top">
                <?php    
                foreach ($order->get_items() as $key => $lineItem) 
                $product_id = $lineItem['product_id'];
                $product = wc_get_product( $product_id );
               
                $item_meta_data = $lineItem->get_meta_data();
                $colormeta = $lineItem->get_meta( 'pa_color', true );
                $sizemeta = $lineItem->get_meta( 'pa_size', true ); ?>
                <div class="order-inner-top-inner">
                    <div class="order-slider-inner"> 
                        <div class="order-inner-left">
                            <div class="order-image">
                                <?php echo $product->get_image(['322', '304']);?>                                    
                            </div>
                        </div>
                        <div class="order-inner-right">
                            <div class="order-info-item order-info-item-name">
                                <?php echo $lineItem['name'] ?>
                           </div>
                           <div class="order-info-item order-info-item ">
                                <span class="order-price"><?php echo $lineItem['total'] . $order_currency?></span>
                           </div>
                           <div class="order-item-quantity"><?php esc_html_e( 'Quantity', 'woocommerce' )?>: <?php echo $lineItem['qty']?></div>
                           <!-- <div class="order-item-metas"><?php echo $colormeta . ' , ' . $sizemeta ?></div>-->
                        </div>
                    </div>
                </div>
                <?php   ?>          
            </div>          
          
          <div class="order-inner-bottom">
               <div class="d-flex justify-content-center">
                    <button class="order-total"><?php echo get_theme_mod('orders_total_button');?></button> 
              </div>
              <div class="totals-toggle">
                  <div class="order-info-item bottom"> <span> <?php esc_html_e( 'Price', 'woocommerce' )?>:</span><span class="order-total-price"> <?php echo $order->get_total() . '  ' . $order_currency; ?></span></div>       
                  <div class="order-info-item bottom"> <span> <?php esc_html_e( 'Quantity', 'woocommerce' )?>:</span> <?php echo  $order->get_item_count(); ?></div>         
                  <div class="order-info-item bottom"> <span><?php esc_html_e( 'Status', 'woocommerce' )?>:</span> <?php

                   if( 'cancelled'== $order->get_status() ) 
                     echo _x( 'Cancelled', 'Order status', 'woocommerce' );                     
                                      
                  if( 'refunded'== $order->get_status() ) 
                     echo _x( 'Refunded', 'Order status', 'woocommerce' );                     
                    
                                
                 
                   ?></div>
                  <div class="order-info-item bottom"> <span><?php esc_html_e( 'Order Date', 'woocommerce' )?></span> <?php 
                    if( $date_created = $order->get_date_created() )
                        // Display the localized formatted date
                         $formated_date_created = $date_created->date_i18n('d.m.Y ');
                         echo  $formated_date_created;
                                       

                   ?></div>
                   <div class="order-info-item bottom"> <span><?php echo get_theme_mod('delivery_date_text')?>: </span> 
                   <?php 
                        // The orders date
                         $date_created = $order->get_date_created();
                         $date_created =  $date_created->date('d.m.Y');
                        // The order date + 5 days
                        $delivery_date = date_i18n( 'd.m.Y', strtotime( $date_created . ' +21 days' ));                       
                        echo $delivery_date;
                    ?>
                     </div>
                </div>
          </div> 

        </div>
       
 </div> 
<?php  ?>

</section>

 <?php  

add_action( 'woocommerce_account_my_returns_endpoint', 'ts_custom_my_returns_content' );

我尝试将它们包含在查询中,但没有帮助。我试过带和不带斜线。

add_action( 'template_redirect', 'wish_custom_redirect' );

function wish_custom_redirect() 
  global $wp;

  if (
        !is_user_logged_in() 
        &&
        ('my-account' == $wp->request)
         &&
        ('my-account/my_returns' == $wp->request)
         or
         &&
        ('my_returns' == $wp->request)
       /*with and without slash in the end and in the beginning*/
        &&
        ('lost-password' != $wp->request)
     ) 
  
    wp_redirect( home_url() );
    exit;
  

是的,我在创建后将它们保存在 settings &gt; permalinks &gt; save changes 中,因为没有它们显示 404。我只是在 settings &gt; permalinks &gt; save changes 中单击“保存更改”。

如何将它们包含在该重定向中并将“丢失密码”排除在外?

【问题讨论】:

您能否准确而简短地告诉我,您希望重定向的条件是什么?我的意思是用简单的英语拼写它们就足够了。谢谢! 我还在你的 sn-p 中间看到了一个错字or '或'我在发布此内容时写道,以解释我尝试了所有的斜线和没有斜线。它必须将未登录的用户从所有 myaccount 端点重定向到主页,但不能从“丢失密码”端点重定向。我所有的端点标签 1)/my-account/edit-account/, 2)/my-account/my_bag/, 3)/my-account/orders/ 4)/my-account/my_purchases/ 5)/my-account /my_returns/ 6)/my-account/my_wishlist/ 7)/my-account/where_is_my_order/ 8)/my-account/how_to_return/ 9)/my-account/need_to_contact/ 但是单独的 PAGE(它不是选项卡)/ my-account/lost-password/必须没有重定向到主页。 【参考方案1】:

你把那些重定向规则搞混了!试试下面的 sn-p:

add_action('template_redirect', 'wish_custom_redirect_extended');

function wish_custom_redirect_extended()

    global $wp, $wp_query;

    if (
        !is_user_logged_in()
        &&
        ('my-account' == $wp->request)
        ||
        ('my-account/my_returns' == $wp->request)
        &&
        ('lost-password' != $wp->request)
    ) 
        wp_safe_redirect(site_url());
        exit;
    

【讨论】:

以上是关于Woocommerce 如何在我的帐户页面上重定向自定义端点的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress登录页面重定向到普通用户的Woocommerce我的帐户页面

如何使用 PrimeFaces 在 JSF 上重定向?

停止 WooCommerce 将 wp-login.php 和 wp-admin 重定向到帐户页面

如何使用javascript在特定页面上重定向

WooCommerce 我的帐户页面的自定义电话号码占位符

Django管理员登录页面在正确的登录凭据上重定向到同一页面