если мы посмотрим на функцию responsebile, которую WooCommerce использует для запроса клиента, вы выберете WooCommerce для выбора всех заказов, связанных с пользователем, на основе идентификатора пользователя.
Исходный код функции:
function woocommerce_account_orders( $current_page ) {
$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,
) ) );
wc_get_template(
'myaccount/orders.php',
array(
'current_page' => absint( $current_page ),
'customer_orders' => $customer_orders,
'has_orders' => 0 < $customer_orders->total,
)
);
}
}
Если вы хотите изменить этот запрос и добавить конкретные идентификаторы заказов, которые не принадлежат этому пользователю, помимо заказов по умолчанию, нам нужно сделать своего рода хак для этого запроса и возможный вариант, который я могу представитьсейчас используется post__in
вместо получения заказов по идентификатору клиента.
мы будем использовать фильтр woocommerce_my_account_my_orders_query
для изменения запроса.
я буду считать, что дополнительные заказы для этого пользователя хранятся в wp_usermeta
таблице
Решение будет таким:
add_filter( 'woocommerce_my_account_my_orders_query', 'modify_my_order_query' , 20, 1 );
function modify_my_order_query( $q ) {
global $wpdb;
$current_user_id = get_current_user_id();
//Check if the user have addtional orders
$secondary_post_ids = get_user_meta( $current_user_id, 'additional_orders', false );
if ( ! empty( $secondary_post_ids ) ) {
// Get All Orders ID for the main customers
$prepare_query = $wpdb->prepare(
" SELECT post_id FROM {$wpdb->postmeta}
WHERE meta_key LIKE %s and meta_value LIKE %d ",
'_customer_user',
$current_user_id
);
$results = $wpdb->get_results( $prepare_query, ARRAY_A );
$main_post_ids = wp_list_pluck( $results, 'post_id' );
// Merge All Orders IDs
$all_posts_ids = ( isset( $secondary_post_ids[0] ) ) ? array_merge( $main_post_ids, $secondary_post_ids[0] ) : $main_post_ids;
//Modify the my Order Query to include all orders ID including the additional ones
unset( $q['customer'] );
$q['post__in'] = $all_posts_ids;
}
return $q;
}
Сначала вы увидите, что в приведенном выше решении мы проверяем, есть ли у текущего пользователя дополнительный заказ, если да, тогда мы выбираем все его значения по умолчанию.ID заказов и объединить массив с его дополнительным заказом, а затем мы изменили запрос, чтобы мы могли получить все эти заказы.
Теперь осталось только позволить пользователю увидеть его дополнительные заказы, и для этого нам нужно использовать user_has_cap
hook.
add_filter( 'user_has_cap', 'give_permissions' , 10, 3 );
function give_permissions( $allcaps, $cap, $args ) {
if ( isset( $cap[0] ) && $cap[0] == 'view_order' ) {
$get_additional_ids = get_user_meta( get_current_user_id(), 'additional_orders', false );
if ( isset( $get_additional_ids[0] ) && in_array( $args[2], $get_additional_ids[0] ) ) {
$allcaps[ $cap[0] ] = true;
}
}
return ( $allcaps );
}
Я верю, что это решение достигнет вашей целевой цели.