我正在编写插件并尝试在foreach循环内的wp_term_relationships表中插入一个新行。我知道变量由于var_dump而具有值,但由于某种原因,我会一致地得到错误。这在show_errors()函数中显示大约600次:
WordPress数据库错误:[密钥1的重复条目'0-0'INSERT INTO
wp_term_relationships
(object_id
,term_taxonomy_id
,term_order
)价值观('','','')
我的代码:
foreach ($cb_t2c_cat_check as $values) {
global $wpdb;
$prefix = $wpdb->prefix;
$table = $prefix . 'term_relationships';
$object_id = $values->object_id;
$taxo_id = $values->term_taxonomy_id;
$num_object_id = (int)$object_id;
$num_taxo_id = (int)$taxo_id;
//var_dump($num_object_id); //This produces values, so why are they not getting inserted into the table?
//var_dump($num_taxo_id); //This produces values, so why are they not getting inserted into the table?
$wpdb->insert(
$table,
array(
'object_id' => $num_object_id,
'term_taxonomy_id' => $num_taxo_id,
'term_order' => 0
), ''
);
//$wpdb->show_errors();
//$wpdb->print_error();
}
答案 0 :(得分:1)
至于为什么它不起作用:不要将$wpdb->insert
的第三个参数设置为空字符串。它相应地格式化每个字段。
它现在所做的相当于:
$wpdb->insert($table, array(
'object_id' => sprintf('', $num_object_id),
'term_taxonomy_id' => sprintf('', $num_taxo_id),
'term_order' => sprintf('', 0)
));
如果你真的想设置第三个参数,你应该这样做:
$wpdb->insert($table, array(
'object_id' => $num_object_id,
'term_taxonomy_id' => $num_taxo_id,
'term_order' => 0
), array('%d', '%d', '%d'));
至于错误:wp_term_relationships表在(object_id,term_taxonomy_id)上有唯一的主键。这意味着该表中不能有两行具有相同的object_id和term_taxonomy_id。
虽然发生这种情况是因为通过将insert的第三个参数设置为空字符串,您试图一遍又一遍地插入object_id = 0和term_taxonomy_id = 0的行。
答案 1 :(得分:0)
上面的答案是正确的,因为数据库需要有唯一的密钥,并且不能插入已存在键值对的行,并且需要设置每个新值的格式。另外,特定于Wordpress,我没有解决的问题,特别是处理term_taxonomy表和更新计数。
首先需要注意的是,该插件旨在更新term_relationships表中帖子的某些类别。这实际上是使用$ wpdb->完成的。插入方法。但是,我确定插件是否实际在term_relationships表中插入新行的测试不是直接查看表,而是转到Wordpress仪表板,选择类别,并查看具有该类别的帖子数量是否超过之前。这不起作用,因为插件从未更新term_taxonomy表中的计数。我只是通过单击Wordpress仪表板中某个类别旁边的“查看”并发现该类别中有多个帖子来发现这一点,即使官方Wordpress“计数”表示没有。
我确认term_taxonomy表,'count'列也需要更新,直接进入数据库并将WHERE ='term_taxonomy_id'放在语句中。果然,有超过1700个结果,尽管Wordpress认为没有结果。
课程:确认$ wpdb->插入方法正在使用PHPMyAdmin,而不一定依赖于Wordpress仪表板。
经过一些修改,代码现在效果很好。这是一个例子:
foreach ($cb_t2c_objects as $values) {
global $wpdb;
$prefix = $wpdb->prefix;
$table = $prefix . 'term_relationships';
$object_id = $values->object_id;
$taxo_id = $values->cat_taxo;
$num_object_id = (int)$object_id;
$num_taxo_id = (int)$taxo_id;
//Need to check to see if row exists for each, if not, then insert.
$cb_t2c_get_row = $wpdb->get_row("
SELECT *
FROM ".$prefix."term_relationships
WHERE object_id = ".$num_object_id." AND term_taxonomy_id = ".$num_taxo_id."
GROUP BY object_id, term_taxonomy_id
", OBJECT);
//var_dump($cb_t2c_get_row);
if ( is_null($cb_t2c_get_row) ) {
//Insert the new values.
$wpdb->insert(
$table,
array(
'object_id' => $num_object_id,
'term_taxonomy_id' => $num_taxo_id,
'term_order' => 0
),
array(
'%d',
'%d',
'%d'
)
);
}
//Set the variables for the count update.
$cb_t2c_term_taxonomy_table = $prefix . 'term_taxonomy';
$cb_t2c_update_data = $wpdb->get_var("
SELECT count(term_taxonomy_id) as 'new_count'
FROM ".$prefix."term_relationships
WHERE term_taxonomy_id = ".$num_taxo_id."
",0,0); //returning NULL
//var_dump($cb_t2c_update_data);
//Update the count in the term_taxonomy table.
$wpdb->query("
UPDATE ".$prefix."term_taxonomy
SET count = ".$cb_t2c_update_data."
WHERE term_taxonomy_id = ".$num_taxo_id."
");