Добавьте пользовательский Metabox в заказы администратора WooCommerce с включенным HPOS

Я пытаюсь добавить новое мета-поле на страницу заказа woocommerce на панели управления.

add_action( 'add_meta_boxes', 'add_meta_box_wrapper' );
function add_meta_box_wrapper() {
    add_meta_box( 'custom_meta_box', __( 'Facture' ), 'metabox_content', 'shop_order', 'side', 'core');
}

function metabox_content() {
    echo '<a>Test button</a>';
}

Это код, который я пробовал, но он не работает.

Если я изменю четвертый параметр функции add_meta_box на публикацию, я смогу отобразить его на странице редактирования публикации, поэтому проблема должна быть в используемом мной пуле. Я также попробовал изменить этот параметр на «wc-orders», а также изменить хук действия на «add_meta_boxes_shop_order» и «add_meta_boxes_wc-orders», как некоторые люди предлагают в других темах, но, похоже, ничего не работает.

У кого-нибудь есть идея?

Замените в коде «shop_order» на «wc_order». Это особый тип сообщений, используемый WooCommerce для заказов.

Paul Vek 02.04.2024 15:43

Кажется, это тоже не работает. Я также попробовал добавить его в хук действия, как сказано в документации, но это ничего не меняет. Developer.wordpress.org/reference/hooks/add_meta_boxes

Pierre-Alexis Lebrun 02.04.2024 15:56
Стоит ли изучать 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 и хотите разрабатывать...
4
2
694
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Эта проблема связана с тем, что Высокопроизводительное хранилище заказов (HPOS) включено, поэтому вам нужно что-то немного другое, чтобы добавить пользовательский Metabox к заказам администратора:

use Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController;

// Add a custom metabox
add_action( 'add_meta_boxes', 'admin_order_custom_metabox' );
function admin_order_custom_metabox() {
    $screen = class_exists( '\Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController' ) && wc_get_container()->get( CustomOrdersTableController::class )->custom_orders_table_usage_is_enabled()
        ? wc_get_page_screen_id( 'shop-order' )
        : 'shop_order';

    add_meta_box(
        'custom',
        'Custom Meta Box',
        'custom_metabox_content',
        $screen,
        'side',
        'high'
    );
}

// Metabox content
function custom_metabox_content( $object ) {
    // Get the WC_Order object
    $order = is_a( $object, 'WP_Post' ) ? wc_get_order( $object->ID ) : $object;

    echo '<p>Number (ID): '.$order->get_order_number().'<p>';
    echo '<a>Test button</a>';
}

Код находится в файле function.php вашей дочерней темы (или в плагине). Протестировано и работает как с включенным HPOS, так и без него.

Сопутствующая документация: Книга рецептов обновления высокопроизводительного хранилища заказов

Связанный:

Вы также делаете что-то вроде этого:

$current_screen = get_current_screen()->id;

if ($current_screen=='shop_order' || $current_screen=='woocommerce_page_wc-orders') {
    add_meta_box(
        'mymeta-box',
        'My Box Title',
        'mymeta_callback',
        $current_screen,
        'side',
        'low'
    );
}

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