Получить мету элемента из заказа WooCommerce, чтобы отобразить его - PullRequest
0 голосов
/ 22 мая 2018

На экране «Таблица заказов администратора» бэкэнда WooCommerce я создал новый столбец для отображения информации.Данные, которые я хотел бы отобразить, представляют собой метаданные каждого элемента в заказе.

Во время процесса заказа для продукта записываются дополнительные метаданные, которые сохраняются в заказе (перейдя в WooCommerce>Заказ> Изменить идентификатор заказа). Это данные, которые я хотел бы получить и вернуть: https://d.pr/free/i/HZzEam

Когда я проверяю эту область, это содержимое таблицы display_meta, которое я хотел бы скопировать и добавить встолбец: https://d.pr/free/i/oGsngJ

Копая файлы WooCommerce, я вижу это область, где создается эта таблица :

$hidden_order_itemmeta = apply_filters(
    'woocommerce_hidden_order_itemmeta', array(
        '_qty',
        '_tax_class',
        '_product_id',
        '_variation_id',
        '_line_subtotal',
        '_line_subtotal_tax',
        '_line_total',
        '_line_tax',
        'method_id',
        'cost',
    )
);
?><div class="view">
    <?php if ( $meta_data = $item->get_formatted_meta_data( '' ) ) : ?>
        <table cellspacing="0" class="display_meta">
            <?php
            foreach ( $meta_data as $meta_id => $meta ) :
                if ( in_array( $meta->key, $hidden_order_itemmeta, true ) ) {
                    continue;
                }
                ?>
                <tr>
                    <th><?php echo wp_kses_post( $meta->display_key ); ?>:</th>
                    <td><?php echo wp_kses_post( force_balance_tags( $meta->display_value ) ); ?></td>
                </tr>
            <?php endforeach; ?>
        </table>
    <?php endif; ?>
</div>

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

Подобно тому, как WooCommerce отображает эту информацию в области «Редактирование заказа», как мне также отображать мета этого элемента заказа в моемcolumn?

Я использую некоторые фрагменты PHP (хук) для создания нового столбца, используя доступное действие из плагина Admin Columns Pro.По сути, это позволило мне добавить столбец существующего настраиваемого поля, а затем переопределить его с любыми данными, которые я хочу.Это текущий код, который у меня есть:

<?php

/**
 * Display custom Event Registration details (item meta data from the order) (which are captured via WooCommerce Add-ons form/fields) on the ORDER LIST/TABLE SCREEN via overriding Admin Columns Pro field column
 *
 * Filter the display value for a column
 *
 * @param mixed $value Custom field value
 * @param int $id Object ID
 * @param AC_Column $column Column instance
 */
function fs_custom_event_registration_details_column_value( $value, $id, $column ) {
    if ( $column instanceof AC_Column_CustomField ) {

        $order = wc_get_order( $id );
        //$order_items = $order->get_items();

        // get the meta key of this column
        $meta_key = $column->get_meta_key();

        // we've added the WooCommerceEventsTicketsPurchased as a custom column via Admin Columns plugin, and now are targetting that one to override it with different data
        if ( 'WooCommerceEventsTicketsPurchased' == $meta_key ) {

            $value = 'testing<br>';

            // example of replacing column field value with a value from a different field
            // $billingphone = get_post_meta( $id, '_billing_phone', true );
            // $value .= sprintf( '<span>'. $billingphone .'</span><br>', $value );

            foreach ( $order->get_items() as $item_id => $item ) {

                $product_name = $item->get_name();
                //$product_id = $item->get_product_id();
                //$product_variation_id = $item->get_variation_id();

                $product_id = $item['product_id'];

                $value .= $product_name;

            }

        }
    }

    // show me the results
    return $value;
}

add_filter( 'ac/column/value', 'fs_custom_event_registration_details_column_value', 10, 3 );

Но, очевидно, это только захват названия продуктов в заказе.Мне нужно получить метаданные заказа для каждого элемента в заказе.

Это не обязательно должно быть в таблице.Маркированный список или даже запятая должны быть в порядке.

Также, если возможно, я хочу выводить только мета товара для продукта в категории «События».

1 Ответ

0 голосов
/ 22 мая 2018

смог сделать это со следующим:

/**
 * Display custom Event Registration details (item meta data from the order) (which are captured via WooCommerce Add-ons form/fields) on the ORDER LIST/TABLE SCREEN via overriding Admin Columns Pro field column
 *
 * Filter the display value for a column
 *
 * @param mixed $value Custom field value
 * @param int $id Object ID
 * @param AC_Column $column Column instance
 */
function fs_custom_event_registration_details_column_value( $value, $id, $column ) {
    if ( $column instanceof AC_Column_CustomField ) {

        $order = wc_get_order( $id );
        //$order_items = $order->get_items();

        // get the meta key of this column
        $meta_key = $column->get_meta_key();

        // we've added the WooCommerceEventsTicketsPurchased as a custom column via Admin Columns plugin, and now are targetting that one to override it with different data
        if ( 'WooCommerceEventsTicketsPurchased' == $meta_key ) {

            // $value is equal to the original value, so we use $value .= to add (append) additional data to it */
            if ( $value == 1) {
                $value .= ' event item<br>';
            }
            elseif ( $value > 1) {
                $value .= ' event items<br>';
            }

            foreach ( $order->get_items() as $item_id => $item ) {

                $product_name = $item->get_name();
                //$product_id = $item->get_product_id();
                //$product_variation_id = $item->get_variation_id();

                $product_id = $item['product_id'];

                // only for items within the Events category
                if ( has_term( 'events', 'product_cat', $product_id ) ) {

                    // wrap HTML around the value output
                    $value .= '<table cellspacing="0" cellpadding="0" style="width: 100%; border: 1px solid rgba(0,0,0,0.66); margin: 0.5em 0;">';
                    $value .= '<thead style="background: rgba(0,0,0,0.1);"><tr><th style="padding: 0.25em; line-height: 1.25em; font-size: 0.875em;">
                        <h5 style="line-height: 1.2em; font-size: 1em; margin: 0; padding: 0; font-weight: 700;">'. $product_name .'</h5>
                        </th></tr></thead>';
                    $value .= '<tbody>';

                    // grab the meta from the item
                    $meta_data = $item->get_formatted_meta_data( '' );

                    // Loop though the data array to set the fields
                    foreach ( $meta_data as $meta_id => $meta ) :

                        // grab the key and strip anything that may be junky
                        $field_display_label = wp_kses_post( $meta->display_key );
                        // grab the key value and stip anything that may be junky, as well as ensuring things are properly wrapped
                        $field_display_value = wp_kses_post( force_balance_tags( $meta->display_value ) );
                        // by default, the key value has p tags wrapping it, so lets remove those for now
                        $field_display_value = str_replace('<p>','',$field_display_value);
                        $field_display_value = str_replace('</p>','',$field_display_value);

                        $value .= '<tr><td style="padding: 0.25em; line-height: 1.25em; font-size: 0.875em; border-top: 1px dotted rgba(0,0,0,0.25);">
                            <strong style="font-weight: 700;">'. $field_display_label .'</strong>: <br>&nbsp;&bull;&nbsp;'. $field_display_value .'</td></tr>';

                    endforeach;

                    // close the HTML wrapper around the value output
                    $value .= '</tbody></table>';

                }
            }
        }
    }

    // show me the results
    return $value;
}

add_filter( 'ac/column/value', 'fs_custom_event_registration_details_column_value', 10, 3 );

Что привело к: https://d.pr/free/i/ou1ORr

Order Screen

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...