【问题标题】:Writing data to an sql database upon payment completed付款完成后将数据写入sql数据库
【发布时间】:2018-06-10 09:31:39
【问题描述】:

我正在尝试从 woocommerce 订单中获取信息,将其放入变量中,然后将其写入 SQL 数据库。我可以正确检索和处理数据。如果我手动运行它,我什至设法将它写入数据库。

我似乎无法让动作挂钩与脚本一起工作。

我遵循了我在这里看到的人们在做类似事情的做法,但到​​目前为止它还没有奏效。我有 3 个主要问题:

  1. 我可以在函数内部定义订单ID吗,

  2. 我是否需要在其他地方调用该函数,

  3. 此操作挂钩是否正确设置为在处理付款后运行。

函数如下:

add_action('woocommerce_payment_complete', 'returnAttributesFromCheckout');
function returnAttributesFromCheckout ($order_id) {

    $connection = mysqli_connect('localhost', 'root', '', 'apptest');

    if(!$connection) {

        die('ded' . mysqli_error($connection));
    }

    global $woocommerce, $post;

    $order = new WC_Order($order_id);

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

        // Get an instance of corresponding the WC_Product object
        $product = $item_data->get_product();

        $rank = $product->get_attribute( 'pa_rank' );
        $money = $product->get_attribute( 'pa_money' );
        $spawner = $product->get_attribute( 'pa_spawner' );
        $permission = $product->get_attribute( 'pa_permission' );
        $kit = $product->get_attribute( 'pa_kit' );
        $crate = $product->get_attribute( 'pa_crate' );
        $tag = $product->get_attribute( 'pa_stag' );
        $duration = $product->get_attribute( 'pa_duration' );
        $d = strtotime("+ $duration Months");
        $endDate = date("d/m/Y", $d);

        $query = "INSERT INTO checkout(rank, money) ";
        $query .= "VALUES('$rank', '$money')";

        $result = mysqli_query($connection, $query);

        if(!$result) {

            die('its dead jim' . mysqli_error($connection));
        }
    }
}

【问题讨论】:

  • 查看参数化查询

标签: php sql wordpress paypal woocommerce


【解决方案1】:

此挂钩仅适用于已付款订单(“COD”、“BACS”和“支票”付款方式之外),并且订单状态始终设置为“处理中”或“已完成”。但如果您正在测试支付网关帐户上对此进行测试,如果缺少收到的交易反馈参数,订单看起来像已支付,但仍处于“暂停”状态,因此不会触发挂钩。

我已经用 Paypal 和另一个信用卡支付网关测试了这个钩子,当交易完成并且订单状态设置为“处理中或完成”时,它会正确触发。

现在为避免该问题,您可以使用 woocommerce_order_status_changed 来定位“处理中”/“已完成”订单状态。

此外,您应该在 Wordpress/Woocommerce 代码中使用专用的wpdb class,而不是使用经典的 PHP SQL 连接。

下面我使用wpdb class 重新访问了您的代码。代码如下:

add_action( 'woocommerce_order_status_changed', 'checkout_custom_table_insert', 20, 4 );
function checkout_custom_table_insert( $order_id, $old_status, $new_status, $order ){

    // Only for 'processing' and 'completed' order status changes
    $statuses = array( 'processing', 'completed' );
    if ( ! in_array( $new_status, $statuses ) ) return;

    // Check if data has been already updated (avoid repetitions)
    $is_done = get_post_meta( $order_id, '_checkout_table_updated', true );
    if( ! empty($is_done) ) return; // We exit if it has been already done

    global $wpdb;

    // Loop through order items
    foreach ($order->get_items() as $item){
        $product = $item->get_product(); // Get the variation product object

        // Choose in the array which data you want to insert (each line is a table column)
        $args = array(
            'rank'          => $product->get_attribute( 'pa_rank' ),
            'money'         => $product->get_attribute( 'pa_money' ),
            'spawner'       => $product->get_attribute( 'pa_spawner' ),
            'permission'    => $product->get_attribute( 'pa_permission' ),
            'kit'           => $product->get_attribute( 'pa_kit' ),
            'crate'         => $product->get_attribute( 'pa_crate' ),
            'stag'          => $product->get_attribute( 'pa_stag' ),
            'duration'      => $product->get_attribute( 'pa_duration' ),
            'end_date'      => date("d/m/Y", strtotime("+ $duration Months")),
        );

        // The SQL INSERT query
        $table = "checkout" // or "{$wpdb->prefix}checkout";
        $wpdb->insert(  $table, $args ); // Insert the data
    }

    // Mark this task as done for this order
    update_post_meta( $order_id, '_checkout_table_updated', '1' );
}

代码进入您的活动子主题(或活动主题)的 function.php 文件中。

这应该会更好......


【讨论】:

  • 我如何检查它的前缀是否正确?我不完全确定你指的是什么。我的原始程序链接到的数据库实际上与创建网站时设置的数据库 wordpress 是分开的,我不确定这是否会有所不同
  • 还有一件事,该函数是否会提取它应该自行传递的所有信息,还是我需要将这些值传递给它?
  • 所以我在接收订单时遇到问题,我使用的是 PayPal 沙箱,当 woocommere 收到订单时,它会将其设置为待处理,并且永远不会将其移至处理或完成状态。如果我手动执行,事件还会触发吗?
  • @Bman76 我对代码做了一些细微的改动。是的,您可以手动将订单状态从“待处理”更改为“处理中”(或“已完成”),并且挂钩也会被触发,因此您的数据将从当前产品变体中提取,并将被推送到您的自定义表格“结帐”...
  • 非常感谢您的帮助。我刚刚做了最后的检查,一切正常。
猜你喜欢
  • 2018-05-23
  • 2015-12-01
  • 2011-06-27
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多