我应该在服务器上使用什么WooCommerce API?

时间:2017-02-05 20:16:55

标签: php wordpress api woocommerce woocommerce-rest-api

我正在编写一个脚本来批量更改产品属性,例如价格,重量和尺寸。我需要直接在安装了WordPress(4.7.2)和WooCommerce(2.6.13)的服务器上运行脚本。我能想到的选择对我来说似乎并不理想:

  1. WooCommerce非REST API 将是我明显的选择,但它会降级为可怕的legacy folder,其气味已被弃用。
  2. WooCommerce REST API link)似乎有些过分:为什么我已经在服务器上进行身份验证并使用HTTP并且只能使用PHP?
  3. 通过update_post_meta()代理数据库似乎容易出错并且难以维护,因为WooCommerce产品属性之间有很多关系;只需查看here的逻辑量就可以复制产品的价格!
  4. WP-CLI 可行,但AFAIK不如PHP脚本灵活;在任何情况下,自{3.0}起it is REST-powered,所以我猜第2点也适用于此。
  5. 我觉得我错过了什么,请帮助我,否则我的大脑会爆炸:-D

2 个答案:

答案 0 :(得分:3)

事实证明,您可以在服务器上使用REST API,而无需验证或执行HTTP请求:您只需构建一个WP_REST_Request对象并将其直接传递给API。

示例:显示产品

这是一个示例PHP脚本,它将使用REST API基于其ID打印产品信息。该脚本应放在WordPress文件夹中并在浏览器中执行;产品ID作为查询参数提供,例如:http://www.yourwebsite.com/script.php?id=123

<?php
/* Load WordPress */
require('wp-load.php');

/* Extract the product ID from the query string */
$product_id = isset( $_GET['id'] ) ? $_GET['id'] : false;

if ( $product_id ) {

    /* Create an API controller */
    $api = new WC_REST_Products_Controller();

    /* Build the request to create a new product */
    $request = new WP_REST_Request ('POST', '', '');
    $request['id'] = $product_id;

    /* Execute the request */
    $response = $api->get_item( $request );

    /* Print to screen the response from the API.
    The product information is in $response->data  */
    print_r( $response );

    /* Also print to screen the product object as seen by WooCommerce */
    print_r( wc_get_product( $product_id ) );

}

示例:创建产品

下一个脚本将创建一个新产品。产品的deatails应直接在脚本中输入set_body_params()函数。有关允许字段的列表,只需使用以前的脚本打印任何产品的数据。

/* Load WordPress */
require('wp-load.php');

/* Create an API controller */
$api = new WC_REST_Products_Controller();

/* Build the request to create a new product */
$request = new WP_REST_Request ('POST', '', '');
$request->set_body_params( array (
    'name' => 'New Product',
    'slug' => 'new-product',
    'type' => 'simple',
    'status' => 'publish',
    'regular_price' => 60,
    'sale_price' => 40,
));

/* Execute the request */
$response = $api->create_item( $request );

/* Print to screen the response from the API */
print_r( $response );

/* Also print to screen the product object as seen by WooCommerce */
print_r( wc_get_product( $response->data['id'] ) );

一些基本的安全措施

将可执行PHP脚本留在您的网站上并不是一个好主意。我宁愿将它们合并到一个插件中,并且只允许授权用户访问它们。要实现这一点,将以下代码添加到脚本中可能很有用:

/* Load WordPress. Replace the /cms part in the path if
WordPress is installed in a folder of its own. */
try {
    require($_SERVER['DOCUMENT_ROOT'] . '/cms/wp-load.php');
} catch (Exception $e) {
    require($_SERVER['DOCUMENT_ROOT'] . '/wp-load.php');
}

/* Restrict usage of this script to admins */
if ( ! current_user_can('administrator') ) {
  die;
}

答案 1 :(得分:1)

嗯,根据你的优秀答案,我可以补充一点,你可以使用wordpress api(v2.wp-api.org)本身来运行它作为一个函数,这样它就会受到保护,你也可以添加身份验证到执行以防万一你关心安全性。就像我通常喜欢为正常设置添加2个插件:api工具箱(更改api路由 - &gt; wp-json)和wp选项并编辑我的功能的选项文件。