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,
     ));
    

        

【问题讨论】:

您能否提供$qtyvar_dump()(或等效项)导致您的期望与现实之间存在这种差异? 我已经编辑了我的问题 你还是没有提供$qtyvar_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 添加意外的行数的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress:wpdb->插入与 wpdb->prepare(wpdb->query("INSERT

Wordpress热门帖子

按评论列出的热门帖子

自定义循环SQL查询(和流行帖子示例)

Wordpress - 计算每年的帖子

SQL SERVER 分页查询 和 Inser 添加并返回Id