我在定制wordpress主题中的woocommerce模板时遇到了一些麻烦。我想添加额外的数据作为变量在我的模板。
我想在仪表板/我的帐户页面上显示活动订单。我想通过将顺序数据变量传递给模板以便能够调用来做到这一点,就像在orders.php
模板中完成的那样。
我知道我可以在我的主题中覆盖wc-template-functions.php
,然后在仪表板或我的帐户的wc_get_templates
函数中添加数据。然而,我不想这样做。
我尝试的是创建一个钩子,如:
显然也
function wc_fr_add_orders_to_account( $fr_account_orders, $current_page ) {
global $fr_account_orders;
$current_page = empty( $current_page ) ? 1 : absint( $current_page );
$customer_orders = wc_get_orders( apply_filters( 'woocommerce_my_account_my_orders_query',
array(
'customer' => get_current_user_id(),
'page' => $current_page,
'paginate' => true,
'status' => array( 'wc-pending' )
) ) );
$fr_account_orders = array(
'current_page' => absint( $current_page ),
'customer_orders' => $customer_orders,
'has_orders' => 0 < $customer_orders->total
);
return $fr_account_orders;
}
add_action( 'woocommerce_account_content', 'wc_fr_add_orders_to_account' );
/theme-directory/woocommerce/templates/myaccount/dashboard.php(也在my-account.php中尝试过)
do_action( 'woocommerce_account_dashboard', $fr_account_orders);
var_dump($fr_account_orders);
$fr_account_orders
返回null。但是,如果我在钩子函数中var_dump
数组,它会返回数据。
放轻松。如果你想返回这个变量,那不是正确的方法。您应该像这样使用apply_filters
:
function wc_fr_add_orders_to_account() {
/* your function */
return $fr_account_orders;
}
add_filter( 'woocommerce_account_dashboard', 'wc_fr_add_orders_to_account' );
和在你的模板..
$my_var = apply_filters( 'woocommerce_account_dashboard', $fr_account_orders );
var_dump( $my_var );
现在,如果你想发送一些变量,这样做:
function wc_fr_add_orders_to_account( $var1, $var2 ) {
/* your function */
return $fr_account_orders;
}
add_filter( 'woocommerce_account_dashboard', 'wc_fr_add_orders_to_account', 10, 3 );
在你的模板中…
$my_var = apply_filters( 'woocommerce_account_dashboard', $fr_account_orders, $var1, $var2 );
var_dump( $my_var );
在这里阅读更多关于apply_filters
的信息https://developer.wordpress.org/reference/functions/apply_filters/还有一件事,尽量不要改变模板,而是在模板的do_action
钩子上使用add_action
以获得更好的兼容性。谢谢!
我尝试了几种方法,但不知道如何保持分页正确。这样可以在我的仪表盘上列出所有的订单。
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 3,
'paged' => $paged,
'meta_key' => '_customer_user',
'meta_value' => get_current_user_id(),
'post_type' => wc_get_order_types(),
'post_status' => array ('wc-pending'),
);
$customer_waiting_orders = new WP_Query( $args );
if ( $customer_available_orders->have_posts() ) :
while ( $customer_available_orders->have_posts() ) : $customer_available_orders->the_post();
//code here
wp_reset_postdata();
endwhile;
endif;