Создать заказ WooCommerce и обновить автора заказа на основе автора первого продукта - PullRequest
1 голос
/ 09 апреля 2020

Я хочу обновить автора заказа WooCommerce на основе автора первого элемента корзины.

WooCommerce не поддерживает авторов из коробки, но я их включил.

function function_to_add_author_woocommerce() {
  add_post_type_support( 'product', 'author' );
  add_post_type_support( 'shop_order', 'author' );

}
add_action('init', 'function_to_add_author_woocommerce', 999 );

Я составил код ниже, но я немного застрял. Не знаю, лучше ли это сделать до создания заказа или после него.

function before_checkout_create_order( $order, $data ) {

    // Vars
    $post = get_post( '42962' ); // Demo first product
    $get_post_author = $post->post_author; // Get author of first product
    $contents = WC()->cart->cart_contents;

    // Get first product
    $imploded = array();
    foreach( WC()->cart->get_cart() as $cart_item ){
       $imploded[] = implode($cart_item['product_id'], $cart_item);
   }

   // Update shop_order author
   $my_post = array(
       'ID' =>  '20', // Demo order_ID, I need to get this as well!
       'post_author' => $get_post_author, 
   );
    wp_update_post( $my_post );

    // Debug
    write_log($imploded);
    write_log($contents);
    write_log($post);
    write_log($get_post_author);

}
add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);

1 Ответ

0 голосов
/ 09 апреля 2020

Я думаю, вы ищете это? Есть несколько крючков, с помощью которых вы в любом случае можете обновить заказ, я предпочитаю woocommerce_checkout_order_processed

get_the_author_meta( string $field = '', int|false $user_id = false )

Допустимые значения параметра $field включают:

https://developer.wordpress.org/reference/functions/get_the_author_meta/

function update_author( $order_id ) {
    if( ! $order_id ) return;

    // Get order object
    $order = new WC_Order( $order_id );

    // Get order items = each product in the order
    $items = $order->get_items();

    // Set variable
    $found = false;

    foreach ( $items as $item ) {
        $product = wc_get_product( $item['product_id'] );
        $author_name = get_the_author_meta( 'display_name', $product->post->post_author );

        // Author if found
        if ( !empty($author_name) ) {
            $found = true;
            // break loop, only first product
            break;
        }
    }   

    // Extra check, to avoid error messages if no author name is available
    if ( $found ) {
        $my_post = array(
           'ID' => $order_id,
           'post_author' => $author_name, 
        );
        wp_update_post( $my_post );
    }

    //$order->save();
}
add_action( 'woocommerce_checkout_order_processed', 'update_author', 10, 1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...