wp удалить автоматические черновики() удаляет ссылки в меню
Со вчерашнего дня задание wp_scheduled_auto_draft_delete
cron каким-то образом удаляет все записи страниц из наших меню. Все записи в таблице wp_postmeta
с meta_key = '_menu_item_object'
и meta_value = 'page'
удаляются в процессе. Отследив запрос на УДАЛЕНИЕ, я обнаружил, что пункты меню удаляются функцией _wp_delete_post_menu_item
. Я получил следующую трассировку стека для этой функции:
#0 _wp_delete_post_menu_item(3244)
#1 call_user_func_array(_wp_delete_post_menu_item, Array ([0] => 3244))
called at [/srv/www/htdocs/biva/wp-includes/plugin.php:470]
#2 do_action(delete_post, 3244) called at
[/srv/www/htdocs/biva/wp-includes/post.php:2483]
#3 wp_delete_post(3244, 1) called at
[/srv/www/htdocs/biva/wp-includes/post.php:5645]
#4 wp_delete_auto_drafts()
#5 call_user_func_array(wp_delete_auto_drafts, Array ()) called at
[/srv/www/htdocs/biva/wp-includes/plugin.php:546]
#6 do_action_ref_array(wp_scheduled_auto_draft_delete, Array ()) called
at [/srv/www/htdocs/biva/wp-cron.php:100]
Но я застрял здесь, я не разработчик WordPress, и я понятия не имею, почему удаление старых черновиков приводит к удалению вложенных пункты меню, хотя главные страницы все еще существуют.
Обходной путь:
В качестве обходного пути мы добавили следующее в начало wp-config
, которое отключит wp-cron
:
/** Disable wp-cron to prevent menu from getting deleted. Detailed Bug description:
http://wordpress.stackexchange.com/questions/145953 **/
define('DISABLE_WP_CRON', true);
Если вы испытываете аналогичные трудности, вы можете попробовать заблокировать строки в таблице wp_postmeta
с помощью meta_key = '_menu_item_object'
и meta_value = 'page'
, а затем отследить сообщение об ошибке, когда WP пытается удалить эти строки, вот как мы исправили нашу ошибку.
Воспроизвести ошибку: Это определенно скрытность опубликуйте плагин, который вызывает нашу ошибку, его можно легко воспроизвести, выполнив следующие действия:
- Установите новый Wordpress 3.9.1.
- Установите плагин скрытой публикации http://wordpress.org/plugins/stealth-publish.
- Создайте несколько тестовых страниц и добавьте их в новое меню.
- Создайте новую страницу с некоторым фиктивным контентом, но не сохраняйте ее!. Оставьте страницу без сохранения.
- Измените системное время на 8 дней в будущее.
- Задание
wp_scheduled_auto_draft_delete
cron будет выполняться, потому что оно выполняется ежедневно и не выполнялось в течение 7 дней, как только вы посетите свою страницу. Затем он найдет вашу никогда не сохраненную фиктивную страницу, удалит ее, так как она старше 7 дней, и меню исчезнет. - Возможно, вам потребуется обновить страницу несколько раз, пока эффект не станет видимым.
Я записал скринкаст о том, как воспроизвести ошибку (но у меня не было времени прокомментировать ее): http://www.youtube.com/watch?v=R9CTggjIfDY
1 answers
Это то, что обычно выполняется запросом wp_get_associated_nav_menu_items()
выглядит так:
SELECT wp_posts.*
FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp_posts.id = wp_postmeta.post_id )
WHERE 1 = 1
AND wp_posts.post_type = 'nav_menu_item'
AND (( wp_posts.post_status <> 'trash'
AND wp_posts.post_status <> 'auto-draft' ))
AND (( wp_postmeta.meta_key = '_menu_item_object_id'
AND Cast(wp_postmeta.meta_value AS CHAR) = '3111' ))
GROUP BY wp_posts.id
ORDER BY wp_posts.post_date DESC
Вот как выглядит ваш:
SELECT wp_posts.*
FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp_posts.id = wp_postmeta.post_id )
LEFT JOIN wp_postmeta AS mt1
ON ( wp_posts.id = mt1.post_id
AND mt1.meta_key = '_stealth-publish' )
INNER JOIN wp_postmeta AS mt2
ON ( wp_posts.id = mt2.post_id )
WHERE 1 = 1
AND wp_posts.post_type = 'nav_menu_item'
AND (( wp_posts.post_status <> 'trash'
AND wp_posts.post_status <> 'auto-draft' ))
AND ( ( wp_postmeta.meta_key = '_menu_item_object_id'
AND Cast(wp_postmeta.meta_value AS CHAR) = '3244' )
OR mt1.post_id IS NULL
OR ( mt2.meta_key = '_stealth-publish'
AND Cast(mt2.meta_value AS CHAR) != '1' ) )
GROUP BY wp_posts.id
ORDER BY wp_posts.post_date DESC
Я бы предположил, что _stealth-publish
материал не имеет никакого отношения к тому, чтобы вмешиваться в запросы пунктов меню навигации.