Rumah  >  Soal Jawab  >  teks badan

Simpan metadata siaran untuk hasil pertanyaan SQL apabila menggunakan cangkuk "woocommerce_thankyou".

Saya cuba menanyakan pangkalan data dan menyerahkan hasilnya kepada update_post_meta 函数。但是不确定我是否正确构建了这个,或者我的 $order_id Adakah terdapat masalah menggunakan ini?

Setelah pesanan dibuat, saya perlu mengemas kini meta pos dengan pengguna yang sedang log masuk dan hasil pertanyaan untuk pesanan semasa, jadi fikir cangkuk woocommerce_thankyou akan masuk akal, tetapi meta pos tidak akan ditulis selepas pesanan sudah selesai. < /p>

add_filter( 'woocommerce_thankyou', 'my_function', 10, 2);
function my_function( $result, $order_id ) {
    // Load the global $post
    global $woocommerce, $post;

    // Get the post ID
    $order_id = $post->ID;

    // Then you can get the order object
    $order = wc_get_order( $order_id );


    $user_ID = get_current_user_id();

    //SQL
    global $wpdb;

    return $wpdb->get_var("SELECT SUM(b03_woocommerce_order_itemmeta.meta_value)
    FROM b03_woocommerce_order_itemmeta
    JOIN b03_woocommerce_order_items ON b03_woocommerce_order_itemmeta.order_item_id = b03_woocommerce_order_items.order_item_id
    JOIN b03_posts ON b03_woocommerce_order_items.order_id = b03_posts.ID
    JOIN b03_postmeta ON b03_posts.ID = b03_postmeta.post_id
    WHERE b03_posts.post_type = 'shop_order'
    AND b03_woocommerce_order_itemmeta.meta_key = 'trees_planted'
    AND b03_postmeta.meta_value = $user_ID
    AND b03_postmeta.meta_key = '_customer_user'
    AND b03_posts.ID = $order_id");
    
    update_post_meta( $order_id, 'trees',$wpdb);
}

Sebarang cadangan tentang cara terbaik untuk menangani perkara ini?

P粉080643975P粉080643975182 hari yang lalu401

membalas semua(1)saya akan balas

  • P粉256487077

    P粉2564870772024-04-01 13:19:09

    Percubaan kod anda mengandungi berbilang pepijat dan ralat:

    • woocommerce_thankyou ialah cangkuk aksi, bukan cangkuk penapis
    • Sahaja $order_id 传递给回调函数,$result T/T
    • Gunakan $wpdb->prefixb03_, ini boleh menjadikannya dinamik
    • $wpdb ialah objek
    • Menggunakan global $woocommerce、$post; adalah berlebihan

    Jadi anda mendapat:

    function action_woocommerce_thankyou( $order_id ) {
        // Get $order object
        $order = wc_get_order( $order_id );
        
        // Is a WC_Order
        if ( is_a( $order, 'WC_Order' ) ) {
            // Get user id
            $user_id = $order->get_user_id();
            
            // Not a guest
            if ( $user_id > 0 ) {
                //SQL
                global $wpdb;
    
                // The SQL query
                $result = $wpdb->get_var( "
                    SELECT SUM( oim.meta_value )
                    FROM {$wpdb->prefix}woocommerce_order_itemmeta as oim
                    JOIN {$wpdb->prefix}woocommerce_order_items as oi ON oim.order_item_id = oi.order_item_id
                    JOIN {$wpdb->prefix}posts as p ON oi.order_id = p.ID
                    JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
                    WHERE p.post_type = 'shop_order'
                    AND oim.meta_key = 'trees_planted'
                    AND pm.meta_value = '$user_id'
                    AND pm.meta_key = '_customer_user'
                    AND p.ID = '$order_id'
                " );
    
                // REMOVE THIS, only for testing purposes
                $result = 10;
    
                // Add the meta data
                $order->update_meta_data( 'trees', $result );
                $order->save();
            }
        }
    }
    add_action( 'woocommerce_thankyou', 'action_woocommerce_thankyou', 10, 1 );
    

    NOTA: Memandangkan anda menggunakan pertanyaan SQL tersuai yang mana data/hasilnya tidak wujud secara umum/secara lalai dalam WooCommerce, tetapi hanya untuk anda, saya telah menggantikannya dengan nilai tetap 10 dalam jawapan saya. Laraskan mengikut keperluan!

    balas
    0
  • Batalbalas