Получить идентификатор позиции заказа в элементах заказа WooCommerce - PullRequest
1 голос
/ 17 апреля 2019

В WooCommerce я пытаюсь изменить URL-адреса загрузки для элементов заказа. Первоначально я использовал идентификатор заказа, но это позволяет только одну подписку на заказ. Поэтому мне нужно, чтобы клиент мог приобрести более одной подписки.

Вот код, который у меня сейчас есть:

if ( !class_exists( 'pl_wcdf_extention' ) ) {

    class pl_wcdf_extention {

        public function __construct() {

            add_filter( 'woocommerce_order_get_downloadable_items', array( $this, 'download_link' ), 10, 2 );

            add_filter( 'woocommerce_customer_get_downloadable_products', array( $this, 'download_link' ), 10, 1 );
        }

        public function download_link( $downloads, $order = null ) {

            $download_url_base = 'https://xxxx.com/';

            // retrieve Order ID from Download array

            $order_id = $downloads [0]['order_id'];

            // retrieve Order data

            $order = wc_get_order( $order_id );

            // retrieve Order Items 

            $order_item = $order->get_items();

            // retrieve first Order Item ID

            $order_item_id = $order_item [0][order_item_id];

            foreach ( $downloads as $download ) {

                $download['download_url'] = $download_url_base . "xxxx-" . $order_item_id . ".svg";

                $tag_item = array(
                    '--native-libs-dir' => '/home/Lib/',
                    '--type' => 'template0001style1',
                    '--data'=> $order_item_id,
                    '--join' => 'horizontal',
                    '--output-file' => '/home/public_html/xxxx-' . $order_item_id . '.svg'
                );

                $args = "";

                foreach ($tag_item as $k=>$v) {
                    $args .= " $k " . " $v ";
                }

                shell_exec("/home/Python-2.7.14/Python-3.6.3/python /home/Lib/generate-code.py $args");
            }

            return $downloads;
        }
    }
}

if ( class_exists( 'pl_wcdf_extention' ) ) {

    if ( ! defined( 'ABSPATH' ) ) {
        exit; // Exit if accessed directly
    }

    global $wpdb;

    define( 'PL_WCDFE_DIR_PATH', plugin_dir_path( __FILE__ ) );
    define( 'PL_WCDFE_PLUGIN_FILE', __FILE__ );

    new pl_wcdf_extention();

}

Все работает, за исключением того, что я не могу получить идентификатор позиции заказа.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 17 апреля 2019

Обновлено

Предполагая, что $ order определен, чтобы получить элемент первого заказа в вашем коде, вы будете использовать:

        // retrieve Order Items 

        $order_items = $order->get_items();

        // retrieve Order Items IDs 

        $order_items_ids = array_keys($order_items);

        // retrieve first Order Item ID

        $order_item_id = reset( $order_items_ids );

Или может быть лучше, используя WC_Data метод get_id() для заказа Item:

        // retrieve Order Items 

        $order_items = $order->get_items();

        // retrieve first Order Item

        $order_item = reset( $order_items );

        // retrieve Order Item ID 

        $order_items_id = $order_item->get_id();

Проверено и работает.


Обновление - Дополнение

Поскольку объект WC_Order не определен в вашем фактическом коде, попробуйте заменить:

        // retrieve Order ID from Download array

        $order_id = $downloads [0]['order_id'];

        // retrieve Order data

        $order = wc_get_order( $order_id );

следующим:

        // When the WC_Order object $order variable is Not defined
        if( is_null($order) || ! is_a($order, 'WC_Order') ) {
            $order_id = $downloads [0]['order_id'];

            if( is_numeric( $order_id ) && get_post_type( $order_id ) === 'shop_order' ) {
                $order = wc_get_order( $order_id );
            } else {
                return new WP_Error( 'broke', __( "Order object is not defined", "woocommerce" ) );
            }
        } 
        // When the $order variable is  defined
        else {
            $order_id = $order->get_id();
        }

Связанный:

...