使用自定义Wordpress API端点更新WooCommerce产品

时间:2019-03-14 16:59:12

标签: php wordpress woocommerce

我正在尝试通过对自定义Wordpress端点的API调用来更新WooCommerce产品。我已经成功接听电话,并且可以访问数据,但是产品实际上没有更新。

我的终点:

add_action('rest_api_init', function(){
  register_rest_route('productupdate/v1', '/update', array(
      'methods' => 'POST',
      'callback' => 'determine_request'
  ));
});

因此,我将POST请求发送到:https://example.com/wp-json/productupdate/v1/update

在我的define_request函数中,我有很多地方要写入日志文件,以确保调用了辅助函数,并且可以接收和读取数据,并且该日志反映出它们均按预期工作。唯一的问题是产品从未真正更新过。

我正在做的事的例子(这是为了简化我的处理方式的简化):

function determine_request($request){
  $data = $request -> get_json_params()['Inserted'][0];
  $sku = $data['InventoryID'];
  $product_id = wc_get_product_id_by_sku($sku);
  $product = wc_get_product($product_id);
  $current_name = $product->get_name();
  $sent_name = $data['Description'];
  if($current_name != $sent_name){
    write_to_log("Current Name does not match sent Name!");
    write_to_log("Changing name from: " . $current_name);
    write_to_log('Changing name to: ' . $sent_name);
    $product->set_name($sent_name);
  } else {
    write_to_log("Current Name matches sent Name. Skipping...");
  }
 }

执行此操作时,我的日志向我显示了所有正确的信息,但没有更新发生。我尝试在函数的末尾添加一个$product->save();,但这并不能解决问题。我尝试在邮递员请求中添加具有管理员登录名和密码的基本身份验证,但这也无济于事。

要更新产品,我缺少什么或做错了什么?

2 个答案:

答案 0 :(得分:0)

函数set_name()不会更新数据库本身中的任何内容,而应该仅更改存储在类对象中的内容。

试试看

$product_detils = array(
          'ID'           => $product_id,
          'post_title'   => $sent_name,
);
wp_update_post($product_detils);

答案 1 :(得分:0)

所以最终对我有用的是这个。

我不需要基本身份验证(在我确认该功能后将其关闭)。但是,在设置字段后,我需要在每个帮助器方法中执行一个$product->save();。例如:

function main(){
  $product_id = 12345;
  $product = wc_get_product($product_id);
  helper1($product);
  helper2($product);
}

function helper1($product){
  $product->set_name("foo");
  $product->save();
}

function helper2($product){
  $product->set_short_description("here is a short description");
  $product->save();
}

希望这对将来像我一样被困住的人有帮助。