php - 如何在functions.php中只运行一次函数
问题描述
有时我需要用代码输入我的外部订单,我有一个可以正常工作的代码,但是如果我把它放在 functions.php 中,它会多次创建订单。我正在寻找一种代码只会创建一个订单/只触发一次的方法
下面的代码有效,但很多时候会创建 5-20 个相同的订单
function create_vip_order() {
global $woocommerce;
$address = array(
'first_name' => '',
'last_name' => '',
'company' => '',
'email' => '',
'phone' => '',
'address_1' => '',
'address_2' => '',
'city' => '',
'state' => '',
'postcode' => '',
'country' => ''
);
// Now we create the order
$order = wc_create_order();
// The add_product() function below is located in /plugins/woocommerce/includes/abstracts/abstract_wc_order.php
$order->add_product( get_product( '2494' ), 1 ); // This is an existing SIMPLE product
$order->set_address( $address, 'billing' );
//
$order->calculate_totals();
$order->update_status("Processing", 'Imported order', TRUE);
}
add_action( 'init', 'create_vip_order' );
/**
* Run code only once
*/
function my_run_only_once() {
if ( get_option( 'my_run_only_once_01' ) != 'completed' ) {
function create_vip_order() {
global $woocommerce;
$address = array(
'first_name' => 'a',
'last_name' => 'a',
'company' => 'a',
'email' => 'a',
'phone' => 'a',
'address_1' => 'a',
'address_2' => 'a',
'city' => 'a',
'state' => 'fl',
'postcode' => '',
'country' => 'usa'
);
// Now we create the order
$order = wc_create_order();
// The add_product() function below is located in /plugins/woocommerce/includes/abstracts/abstract_wc_order.php
$order->add_product( get_product( '3283' ), 3 );
$order->set_address( $address, 'billing' );
$order->set_address( $address, 'shipping' );
//
$order->calculate_totals();
$order->update_status("Processing", 'Imported order', TRUE);
}
add_action( 'init', 'create_vip_order' );
update_option( 'my_run_only_once_01', 'completed' );
}
}
add_action( 'admin_init', 'my_run_only_once' );
试过了,但什么也没发生
如何强制该代码仅创建 1 个订单?
解决方案
更新 2 - 自 WooCommerce 3 以来,您的代码中存在一些错误和已弃用的内容。请尝试以下操作(已注释):
// Function that create an order
function create_vip_order() {
// Create a WC_Order instance object
$order = wc_create_order();
$order->add_product( wc_get_product( '3283' ), 3 ); // <== get_product() is deprecated and replaced by wc_get_product()
$address = array(
'first_name' => 'a',
'last_name' => 'a',
'company' => 'a',
'address_1' => 'a',
'address_2' => 'a',
'city' => 'a',
'state' => 'FL', // <== UPERCASE
'postcode' => '',
'country' => 'USA', // <== UPERCASE
'email' => 'abc@abc.com', // <== EMAIL REQUIRED
'phone' => '',
);
$order->set_address( $address, 'billing' );
$order->set_address( $address, 'shipping' );
$order->calculate_totals();
$order->update_status('processing', 'Imported order', true); // <== LOWERCASE for the WC status
}
// Triggered once
add_action( 'init', 'my_run_only_once' );
function my_run_only_once() {
if ( did_action( 'init' ) >= 2 )
return;
if( ! get_option('run_create_vip_order_once') ) {
create_vip_order(); // Run the function
update_option( 'run_create_vip_order_once', true );
}
}
现在创建订单的函数将按预期只运行一次。请注意,global $woocommerce
不再需要。
推荐阅读
- android - 某些手机中未显示 Toast 通知
- python - 多重继承:第二个基类构造函数要求泄漏到第一个基类构造函数
- jquery - Jquery滚动减少div的比例
- ruby-on-rails - Ruby on Rails 路由部署问题
- mysql - 如何在 sequelize 上创建存储过程
- java - 如何使用 Netty Reactor 关闭 TcpClient 连接?
- c# - 条码 ASP.NET C# 问题
- html - 在 PhpStorm 中选择标签。我想在 PhpStorm 中打开标签,关闭它并将选择器放在中间(就像在 Sublime 中一样)
- php - 是否可以在 MySQL 中的其他记录之间添加记录?
- redis - redis.call 失败