Woocommerce – как получить все заказы текущего пользователя (для страницы Orders.php)

Я пытаюсь создать несколько коротких кодов, которые отображают некоторую информацию, такую ​​​​как имя и номер заказа для всех заказов, размещенных пользователем.

Это короткие коды. Первый возвращает 0 в качестве значения, я не понимаю, где я не прав. Второй не отображает значения. Может ли кто-нибудь помочь мне, указав на ошибки?

Мне нужно работать с шорткодами, потому что я воссоздаю страницу orders.php.

// Get All Orders numbers of current user
add_shortcode( 'prcsed_order_numb' , 'prcsed_order_1' );
function prcsed_order_1(){
    
$customer = new WC_Customer( get_current_user_id() );
$order = new WC_Order( $customer_order );

  if ( is_a( $order, 'WC_Order' ) ) {
     return $order->get_order_number();
     }  
   
}


// Get All Orders Name of current user
add_shortcode( 'prcsed_order_name' , 'prcsed_order_2' );
function prcsed_order_2(){

// Get an instance of the WC_Order object 
$order = new WC_Order( $customer_order );

foreach ( $customer_orders->orders as $customer_order ) {
     return $order = $item->get_name();
     }
   
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я настоятельно рекомендую проявлять осторожность при реализации этого решения. Код, который вы опубликовали, содержит ряд проблем и будет обрабатывать конфиденциальные данные клиентов. Ошибка может привести к утечке данных.


В обратном вызове prcsed_order_2() вы пытаетесь использовать несуществующие переменные. Вы также возвращаетесь в цикле foreach, поэтому он никогда не пройдет первую итерацию цикла.

Пример:

// Give the callback function a clear and descriptive name.
function wpse_get_customer_order_names() {
  
    // Can you be certain the user is logged in at this stage...
    // Consider how you might want to validate the user.

    // Get all orders for the current user.
    $customer_orders = wc_get_orders([
        'customer_id' => get_current_user_id(),
    ]);

    // Transform the array of order objects into an array of order names.
    $order_names = array_map( function( $order ) {
        return $order->name;
    }, $customer_orders );

    // Return as a string, ready for output,
    return implode( ', ', $order_names );
}
add_shortcode( 'prcsed_order_name' , 'wpse_get_customer_order_names' );

Те же принципы можно применить к другим связанным шорткодам, которые касаются данных заказа клиента. В дополнение к проблеме безопасности, поднятой ранее, я бы поставил под сомнение влияние такой реализации на производительность.

Спасибо за ответ. Он отлично работает, как и ожидалось, даже если я ищу другой результат. Не могли бы вы дать мне дополнительные указания о том, как принять меры безопасности и производительности? Есть ли какие-либо справочные ссылки или рекомендации?

Snake 10.04.2022 17:01

Здесь огромное количество ошибок, возврат в цикле FOR просто вернет 1-ю итерацию и переменные, которые, кажется, не инициализированы и т. д.... но для тестирования

Возможно, вы вызываете шорткод для ранней попытки; Я подправил методы только для собственного тестирования

add_action('init', 'xp33221_add_custom_shortcode');

function xp33221_add_custom_shortcode()
{
    add_shortcode( 'prcsed_order_numb' , 'prcsed_order_1' );
    add_shortcode( 'prcsed_order_name' , 'prcsed_order_2' );
}

function getCustOrder(int $orderNum): ?WC_Order
{
    $order = wc_get_order($orderNum);

    if ($order instanceof \WC_Order)) {
       return $order;
    }  

    return null;
}

function prcsed_order_1(): ?int
{
    $order = getCustOrder($customer_order);
    
    return $order instanceof \WC_Order 
        ? $order->get_order_number() 
        : $order;
}

function prcsed_order_2() null|mixed
{
    $order = getCustOrder($customer_order);
    
    return $order instanceof \WC_Order 
        ? $order->get_order_key() 
        : $order;   
}

Другие вопросы по теме