Я пытаюсь отобразить пользовательское уведомление в элементе меню своей учетной записи на основе общей суммы покупок в Woocommerce на основе этого кода ответа:
Пользовательское уведомление о корзине на основе общей суммы покупки в Woocommerce
Это не работает, как я хотел бы. Что я делаю не так?
Это код, который я использую:
add_filter ( 'woocommerce_account_menu_items', 'xu', 40 );
function xu( $menu_links ){
$menu_links = array_slice( $menu_links, 0,3 , true )
+ array( 'xu' => 'Xu của bạn' )
+ array_slice( $menu_links, 3, NULL, true );
return $menu_links;
}
add_action( 'init', 'add_endpoint' );
function add_endpoint() {
add_rewrite_endpoint( 'xu', EP_PAGES );
}
add_action( 'woocommerce_account_xu_endpoint', 'xuxu' );
function xuxu() {
if( ! WC()->session->get( 'purchases_sum' ) ){
WC()->session->set('purchases_sum',
get_customer_total_purchases_sum());
}
$total_purchases = WC()->session->get( 'purchases_sum' );
if ( $total_purchases == 0 ) return; // We exit (no purchases or non logged users)
if ( ( 10000 - $total_purchases ) > 0 )
{
echo 'You need an extra ' . wc_price( 10000 - $total_purchases ) . ' at all to get a... ';
}
else
{
echo '... ';
}
}
Любая помощь приветствуется.
Пожалуйста, при запросе в StackOverFlow, используйте реальный английский в именах функций, переменных и тексте, так как это для большого сообщества, где английский является языком. Старайтесь всегда давать явные имена.
Чтобы содержимое отображалось для вашего пользовательского пункта меню, вам нужно обновить правила перезаписи.
Для этого перейдите в «Настройки WordPress»> «Постоянные ссылки» и нажмите «Сохранить изменения». Теперь ваш контент появится.
Вот ваш повторный код (в чистом формате) с некоторыми дополнениями для удаления значения сеанса на странице спасибо:
// Utililty function to get customer's total purchases sum
function get_customer_total_purchases_sum() {
$current_user_id = get_current_user_id(); // Current user ID
if( $current_user_id == 0 ) return 0; // we return zero if customer is not logged in
global $wpdb;
// return the SQL query (paid orders sum)
return $wpdb->get_var("SELECT SUM(pm.meta_value) FROM {$wpdb->prefix}postmeta as pm
INNER JOIN {$wpdb->prefix}postmeta as pm2 ON pm.post_id = pm2.post_id
INNER JOIN {$wpdb->prefix}posts as p ON pm.post_id = p.ID
WHERE p.post_status LIKE 'wc-completed' AND p.post_type LIKE 'shop_order'
AND pm.meta_key LIKE '_order_total' AND pm2.meta_key LIKE '_customer_user'
AND pm2.meta_value LIKE '$current_user_id'");
}
add_filter ( 'woocommerce_account_menu_items', 'custom_account_menu_items', 10 );
function custom_account_menu_items( $menu_links ){
$menu_links = array_slice( $menu_links, 0,3 , true )
+ array( 'rewards' => 'Rewards' )
+ array_slice( $menu_links, 3, NULL, true );
return $menu_links;
}
add_action( 'init', 'add_rewards_account_endpoint' );
function add_rewards_account_endpoint() {
add_rewrite_endpoint( 'rewards', EP_PAGES );
}
add_action( 'woocommerce_account_rewards_endpoint', 'rewards_account_endpoint_content' );
function rewards_account_endpoint_content() {
if( ! WC()->session->get( 'purchases_sum' ) ){
WC()->session->set('purchases_sum', get_customer_total_purchases_sum());
}
$total_purchases = WC()->session->get( 'purchases_sum' );
if ( $total_purchases == 0 ) return; // We exit (no purchases or non logged users)
if ( ( 10000 - $total_purchases ) > 0 )
{
echo 'You need an extra ' . wc_price( 10000 - $total_purchases ) . ' at all to get a... ';
}
else
{
echo '... ';
}
}
// Removing the purchase_sum session value on thankyou page.
add_action( 'template_redirect', 'removing_purchases_sum_session' );
function removing_purchases_sum_session( ) {
if ( is_wc_endpoint_url('order-received') && WC()->session->get( 'purchases_sum' ) ) {
// We remove this session variable in thankyou page (if it still exist)
WC()->session->__unset( 'purchases_sum' );
}
}
Этот код помещается в файл function.php вашей активной дочерней темы (или темы). Проверено и работает.
Других решений пока нет …