Foreach 添加 wpdb->insert 添加意外的行数
Posted
技术标签:
【中文标题】Foreach 添加 wpdb->insert 添加意外的行数【英文标题】:Foreach add wpdb->insert adding unexpected number of rows 【发布时间】:2019-01-15 18:48:14 【问题描述】:我正在尝试将在数组中找到的一行 foreach 值插入到 wordpress 数据库中。但是,在保存新帖子时,我在表中得到了意外的行数?
例如,如果我将最大条目设置为 4 并单击保存,我最终会得到 6 行吗?
add_action( 'save_post', 'mp_sync_on_product_save', 10, 1 );
function mp_sync_on_product_save( $product_id )
global $wpdb;
$product = wc_get_product( $product_id );
$qty = get_field('maximum_entries', $product_id);
print_r($qty);
$array = range(1, $qty);
foreach ($array as $ticket)
$wpdb->insert('wp_tickets', array(
'ticket_number' => $ticket,
));
$array 的变量转储
array (size=4)
0 => int 1
1 => int 2
2 => int 3
3 => int 4
$qty 的变量转储
string '4'
将插入的行输出到 wp_tickets
id--order_id--ticket_number--lottery_id
44----0----------1----------------0
45----0----------0----------------0
46----0----------1----------------0
47----0----------2----------------0
48----0----------3----------------0
49----0----------4----------------0
更新代码
add_action('save_post', 'my_acf_save_post', 100, 3);
function my_acf_save_post( $post_id, $post, $update )
global $wpdb;
global $post;
if( ! ( wp_is_post_revision( $post_id) || wp_is_post_autosave( $post_id ) ) )
$qty = wc_clean( $_POST['_max_tickets']);
$array = range(1, $qty);
foreach ($array as $ticket)
$wpdb->insert('wp_tickets', array(
'ticket_number' => $ticket,
'lottery_id' => $post_id,
));
【问题讨论】:
您能否提供$qty
的var_dump()
(或等效项)导致您的期望与现实之间存在这种差异?
我已经编辑了我的问题
你还是没有提供$qty
的var_dump()
。
抱歉,我现在已经包含了
如果这正是您的代码和输出,那么肯定有问题。难道是当您在 save_post 上触发另一个插入数据库的操作时?
【参考方案1】:
这是因为根据 wordpress 核心功能 save_post 钩子触发多次(例如:自动保存)请参阅文档 Here
所以第一次 $qty 为空。所以 $array 值将是
数组(2) [0]=> int(1) [1]=> int(0)
你需要重写代码如下。
add_action( 'save_post', 'mp_sync_on_product_save', 11, 1 );
function mp_sync_on_product_save( $product_id )
global $wpdb;
if( ! ( wp_is_post_revision( $product_id) || wp_is_post_autosave( $product_id ) ) )
$product = wc_get_product( $product_id );
$qty = get_field('maximum_entries', $product_id);
$array = range(1, $qty);
foreach ($array as $ticket)
$wpdb->insert('wp_tickets', array(
'ticket_number' => $ticket,
));
NB : 保持 add_action 优先级大于 10 因为它的默认值 优先级
【讨论】:
嗨@Mohammed,我已经添加了你的建议,但它仍然无法正常工作 又插入6行了吗? 是的,我将优先级改为 10、3,现在看起来可以正常工作了 第四个是接受的参数,不是优先级developer.wordpress.org/reference/functions/add_action 嗨,我已将其更改为 11、3,但它仍在顶部添加两行以上是关于Foreach 添加 wpdb->insert 添加意外的行数的主要内容,如果未能解决你的问题,请参考以下文章