Я пытаюсь отладить мой проект 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
не появляется.
My 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
не сохраняет запись в базе данных?
EDIT
Подождите ... теперь мне интересно ... это потому, что есть какой-то хук WordPress, который срабатывает дальше по ходу процесса? И этот хук делает что-то вроде сброса всех терминов отношений или что-то странное, подобное Я потерян ...
EDIT
Я обновил код по другому сценарию, который более четко показывает мою проблему. Обратите внимание, что в моих журналах отображается ошибка дублирующегося ключа, хотя я не могу найти эту дублирующую запись в своей базе данных?
EDIT
Когда я изменяю свою функцию на эту, тогда термин появляется, как и ожидалось в таблице 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;
}
Но проблема в том, что оператор выхода убивает всю страницу. Если я удаляю оператор выхода, то что-то еще вниз по течению заставляет мою вновь сохраненную запись исчезать.
То есть я действительно думаю, что что-то происходит внизу по течению? Как мне тогда программно сохранить новый термин в объекте?
EDIT
Может быть, мне нужно попробовать использовать этот крючок?
https://developer.wordpress.org/reference/hooks/set_object_terms/