recherche

Maison  >  Questions et réponses  >  le corps du texte

Enregistrer les métadonnées de publication pour les résultats de requête SQL lors de l'utilisation du hook "woocommerce_thankyou"

J'essaie d'interroger une base de données et de transmettre les résultats à update_post_meta 函数。但是不确定我是否正确构建了这个,或者我的 $order_id Y a-t-il un problème lors de l'utilisation de ceci ?

Une fois qu'une commande est passée, je dois mettre à jour la méta de la publication avec l'utilisateur actuellement connecté et les résultats de la requête pour la commande en cours, j'ai donc pensé que le crochet woocommerce_thankyou aurait du sens, mais la méta de la publication ne sera pas écrite après la commande. est terminé. < /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);
}

Des suggestions sur la meilleure façon de gérer cela ?

P粉080643975P粉080643975238 Il y a quelques jours486

répondre à tous(1)je répondrai

  • P粉256487077

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

    Votre tentative de code contient plusieurs bugs et erreurs :

    • woocommerce_thankyou est un crochet d'action, pas un crochet filtre
    • Seulement $order_id 传递给回调函数,$result N/A
    • Utilisez $wpdb->prefixb03_, cela peut le rendre dynamique
    • $wpdb est un objet
    • L'utilisation de global $woocommerce、$post; est redondante

    Vous obtenez donc :

    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 );
    

    REMARQUE : Puisque vous utilisez une requête SQL personnalisée où les données/résultats n'existent pas généralement/par défaut dans WooCommerce, mais juste pour vous, je l'ai remplacé par la valeur fixe de 10 dans ma réponse. Ajustez au besoin!

    répondre
    0
  • Annulerrépondre