WooCommerce 文档

title: "使用 WooCommerce CRUD 对象进行开发" post_status: publish comment_status: open taxonomy: category: - woocommerce post_tag: - Data Management - Best Practices - Repos


使用 WooCommerce CRUD 对象进行开发

CRUD 是对数据库或资源上可以执行的四个基本操作的缩写:创建、读取、更新、删除。

WooCommerce 3.0 引入了 CRUD 对象,用于处理 WooCommerce 数据。在您的代码中,尽可能使用这些对象,而不是直接更新元数据或使用 WordPress 文章对象。

每个对象都包含一个用于控制其数据的结构化数据(属性),以及每个属性的 getter 和 setter,以及一个用于与数据存储交互的保存/删除方法。 数据存储负责实际的保存/读取操作。 对象本身不需要知道数据存储在哪里。

CRUD 的优势

CRUD 对象结构

[WC_Data](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/includes/abstracts/abstract-wc-data.php) 类是 CRUD 对象的基本实现,所有 CRUD 对象都继承自它。 需要注意的最重要的属性是 $data,它是一个数组,包含每个对象支持的属性,以及 $id,它是对象的 ID。

优惠券对象类 是一个很好的例子,它展示了如何扩展 WC_Data 并为所有属性添加 CRUD 函数。

数据

$data 存储属性名称和默认值:

/**
 * 数据数组,包含默认值。
 * @since 3.0.0
 * @var array
 */
protected $data = array(
    'code'                        => '',
    'amount'                      => 0,
    'date_created'                => '',
    'date_modified'               => '',
    'discount_type'               => 'fixed_cart',
    'description'                 => '',
    'date_expires'                => '',
    'usage_count'                 => 0,
    'individual_use'              => false,
    'product_ids'                 => array(),
    'excluded_product_ids'        => array(),
    'usage_limit'                 => 0,
    'usage_limit_per_user'        => 0,
    'limit_usage_to_x_items'      => 0,
    'free_shipping'               => false,
    'product_categories'          => array(),
    'excluded_product_categories' => array(),
    'exclude_sale_items'          => false,
    'minimum_amount'              => '',
    'maximum_amount'              => '',
    'email_restrictions'          => array(),
    'used_by'                     => array(),
);

获取器和设置器

数组中的每个键(属性)都有一个对应的获取器和设置器,例如 set_used_by()get_used_by()$data 本身是私有的,因此必须使用获取器和设置器来访问数据。

示例获取器:

/**
 * 获取所有使用当前优惠券的用户记录。
 * @since  3.0.0
 * @param  string $context
 * @return array
 */
public function get_used_by( $context = 'view' ) {
    return $this->get_prop( 'used_by', $context );
}

示例设置器:

/**
 * 设置哪些用户已经使用了此优惠券。
 * @since 3.0.0
 * @param array $used_by
 * @throws WC_Data_Exception
 */
public function set_used_by( $used_by ) {
    $this->set_prop( 'used_by', array_filter( $used_by ) );
}

set_propget_propWC_Data 的一部分。 它们应用各种过滤器(基于上下文)并处理更改,因此我们可以高效地仅保存已更改的属性,而不是所有属性。

关于 $context 的说明:当获取用于前端或显示的的数据时,使用 view 上下文。 这会对数据应用过滤器,以便扩展可以动态更改值。 当在后端显示用于编辑的值时,应使用 edit 上下文,并且用于将数据保存到数据库时也应使用 edit 上下文。 使用 edit 上下文不会对数据应用任何过滤器。

构造函数

CRUD 对象的构造函数用于从数据库中读取数据。 实际读取操作不是由 CRUD 类本身完成,而是由其数据存储层完成。

示例:

/**
 * 优惠券构造函数。加载优惠券数据。
 * @param mixed $data 优惠券数据,对象、ID 或代码。
 */
public function __construct( $data = '' ) {
    parent::__construct( $data );

    if ( $data instanceof WC_Coupon ) {
        $this->set_id( absint( $data->get_id() ) );
    } elseif ( is_numeric( $data ) && 'shop_coupon' === get_post_type( $data ) ) {
        $this->set_id( $data );
    } elseif ( ! empty( $data ) ) {
        $this->set_id( wc_get_coupon_id_by_code( $data ) );
        $this->set_code( $data );
    } else {
        $this->set_object_read( true );
    }

    $this->data_store = WC_Data_Store::load( 'coupon' );
    if ( $this->get_id() > 0 ) {
        $this->data_store->read( $this );
    }
}

注意,它根据传递给对象的 data 设置 ID,然后调用数据存储层以从数据库中检索数据。 一旦数据通过数据存储层读取,或者如果未设置 ID,则 $this->set_object_read( true ); 被设置,以便数据存储层和 CRUD 对象知道它已读取。 一旦设置了此标志,更改就会被跟踪。

保存和删除

savedelete 方法在 CRUD 子类中是可选的,因为 WC_Data 父类可以处理它们。 当调用 save 时,数据存储层用于将数据存储到数据库。 delete 从数据库中移除对象。 必须调用 save 方法才能使更改永久生效,否则这些更改将被丢弃。

WC_Data 中的 save 方法如下所示:

/**
 * `save` 方法应该根据对象是否存在来创建或更新。
 *
 * @since  2.6.0
 * @return int
 */
public function save() {
    if ( $this->data_store ) {
        // 在保存到数据库之前触发操作。 允许您在保存之前调整对象属性。
        do_action( 'woocommerce_before_' . $this->object_type . '_object_save', $this, $this->data_store );

        if ( $this->get_id() ) {
            $this->data_store->update( $this );
        } else {
            $this->data_store->create( $this );
        }
        return $this->get_id();
    }
}

根据对象是否已经具有 ID,会使用更新/创建操作。 ID 将在创建后设置。

delete 方法如下所示:

/**
 * 删除对象,将 ID 设置为 0,并返回结果。
 *
 * @since  2.6.0
 * @param  bool $force_delete
 * @return bool 结果
 */
public function delete( $force_delete = false ) {
    if ( $this->data_store ) {
        $this->data_store->delete( $this, array( 'force_delete' => $force_delete ) );
        $this->set_id( 0 );
        return true;
    }
    return false;
}

CRUD 使用示例

创建一个新的简单产品

$product = new WC_Product_Simple();
$product->set_name( 'My Product' );
$product->set_slug( 'myproduct' );
$product->set_description( 'A new simple product' );
$product->set_regular_price( '9.50' );
$product->save();

$product_id = $product->get_id();

更新现有优惠券

$coupon = new WC_Coupon( $coupon_id );
$coupon->set_discount_type( 'percent' );
$coupon->set_amount( 25.00 );
$coupon->save();

获取客户信息

$customer = new WC_Customer( $user_id );
$email    = $customer->get_email();
$address  = $customer->get_billing_address();
$name     = $customer->get_first_name() . ' ' . $customer->get_last_name();

优惠券管理

本页面用于管理优惠券。您可以查看、创建、编辑和删除优惠券。

优惠券详情

显示单个优惠券的详细信息,包括:

优惠券列表

显示所有优惠券的列表,包括:

批量操作

您可以对多个优惠券进行批量操作,例如:

导入/导出

您可以将优惠券数据从一个系统导入到另一个系统,或者将优惠券数据导出为文件。

优惠券代码

以下是一些常用的优惠券代码示例:

邮件通知

当客户使用优惠券时,您可以发送电子邮件通知。

账单 (Billing)

显示与优惠券相关的账单信息。

常见问题

错误信息

提示