Wordpress保存wp_term_relationship的困难

时间:2019-06-13 02:21:03

标签: wordpress woocommerce

我正在尝试调试Dokan-Woocommerce-Wordpress项目。由于某种原因,我的insert语句未“完成”。与之类似,$wpdb对象似乎在运行查询,但是结果未反映在数据库内容中。这是我的测试插件代码:

function save_term_john( $post_id )
{

global $wpdb;

$post_id = 380;
$tid = 200;

$sql = "INSERT INTO {$wpdb->prefix}term_relationships (object_id,term_taxonomy_id) SELECT ".intval($post_id).",".intval($tid);
$wpdb->query($sql);
file_put_contents("./testcall.txt",$wpdb->last_query."\n\n",FILE_APPEND | LOCK_EX);
file_put_contents("./testcall.txt",$wpdb->last_error."\n\n",FILE_APPEND | LOCK_EX);

$sql = "UPDATE {$wpdb->prefix}term_relationships SET term_taxonomy_id = ".intval($tid)." WHERE object_id = ".intval($post_id)." AND term_taxonomy_id = ".intval($tid);
$wpdb->query($sql);     
file_put_contents("./testcall.txt",$wpdb->last_query."\n\n",FILE_APPEND | LOCK_EX);
file_put_contents("./testcall.txt",$wpdb->last_error."\n\n",FILE_APPEND | LOCK_EX);


}

add_action( 'save_post', 'save_term_john' );

我通过在dokan-woocommerce-wordpress项目中按保存产品来触发此操作。

然后,当我查看数据库表wp_term_relationships时,没有显示object_id:380,taxonomy_term_id:200的记录。

我的testcall.txt显示以下结果

INSERT INTO wp_term_relationships (object_id,term_taxonomy_id) SELECT 380,200 /* From [john.com/dashboard/products/?product_id=380&action=edit&message=success] in [/1/wp-content/plugins/john/john.php:218] */



UPDATE wp_term_relationships SET term_taxonomy_id = 200 WHERE object_id = 380 AND term_taxonomy_id = 200 /* From [john.com/dashboard/products/?product_id=380&action=edit&message=success] in [/wp-content/plugins/john/john.php:223] */



INSERT INTO wp_term_relationships (object_id,term_taxonomy_id) SELECT 380,200 /* From [john.com/dashboard/products/?product_id=380&action=edit&message=success] in [/wp-content/plugins/john/john.php:218] */

Duplicate entry '380-200' for key 'PRIMARY'

UPDATE wp_term_relationships SET term_taxonomy_id = 200 WHERE object_id = 380 AND term_taxonomy_id = 200 /* From [john.com/dashboard/products/?product_id=380&action=edit&message=success] in [/wp-content/plugins/john/john.php:223] */

因此,根据我的testcall.txt,我的save_post挂钩被触发了两次?出于某种原因,我的插入语句没有“完成”?即使我在数据库中没有看到重复的条目,也有一条关于重复条目的消息?

当我从testcall.txt中获取相同的查询并直接针对数据库运行它们时,一切正常。

我在做什么错? save_term_john为什么不将记录保存到数据库?

编辑

等等...现在我想知道...是因为某些WordPress钩子在此过程中向下游触发了吗?那个钩子有没有像刷新所有术语关系之类的东西或类似的东西?我迷路了...

编辑

我用另一种情况更清楚地显示了我的问题,更新了代码。请注意,即使我在数据库中找不到该重复记录,我的日志也会显示重复的键错误?

编辑

当我将函数更改为此时,该术语将按预期出现在wp_terms_relationships表中。

function save_term_john( $post_id )
{
$post_id = 380;
$tid = 200;
$result = wp_set_object_terms($post_id,$tid,'product_shipping_class',true);
exit;
}

但是问题是exit语句杀死了整个页面。如果我删除了退出语句,那么更进一步的处理会使我新保存的记录消失。

所以我真的是在下游发生了什么事?然后,我应该如何以编程方式将新术语保存到对象?

编辑

也许我需要尝试使用此挂钩? https://developer.wordpress.org/reference/hooks/set_object_terms/

0 个答案:

没有答案