我正在尝试调试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/