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 пытается удалить эти строки, вот как мы исправили нашу ошибку.

Воспроизвести ошибку: Это определенно скрытность опубликуйте плагин, который вызывает нашу ошибку, его можно легко воспроизвести, выполнив следующие действия:

  1. Установите новый Wordpress 3.9.1.
  2. Установите плагин скрытой публикации http://wordpress.org/plugins/stealth-publish.
  3. Создайте несколько тестовых страниц и добавьте их в новое меню.
  4. Создайте новую страницу с некоторым фиктивным контентом, но не сохраняйте ее!. Оставьте страницу без сохранения.
  5. Измените системное время на 8 дней в будущее.
  6. Задание wp_scheduled_auto_draft_delete cron будет выполняться, потому что оно выполняется ежедневно и не выполнялось в течение 7 дней, как только вы посетите свою страницу. Затем он найдет вашу никогда не сохраненную фиктивную страницу, удалит ее, так как она старше 7 дней, и меню исчезнет.
  7. Возможно, вам потребуется обновить страницу несколько раз, пока эффект не станет видимым.

Я записал скринкаст о том, как воспроизвести ошибку (но у меня не было времени прокомментировать ее): http://www.youtube.com/watch?v=R9CTggjIfDY

Author: Gellweiler, 2014-05-29

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 материал не имеет никакого отношения к тому, чтобы вмешиваться в запросы пунктов меню навигации.

 5
Author: Rarst, 2014-05-30 11:56:22