Intereting Posts
Пользовательский URL-адрес типа пост-типа, когда тип сообщения имеет строку архива Как настроить DNS Если я использую плагин еще-другой-многосайтовый-менеджер? Автоматическое добавление новых тегов в подменю Показать несколько следующих и предыдущих сообщений Обновить сообщение, чтобы удалить липкую опцию разбиение на страницы разбито – нажатие следующих дисплеев "страница не найдена" Слишком много 499 запросов для файла XMLRPC.php в журнале доступа NGINX wp_embed_register_handler не работает Где ввести код для получения идентификатора терминов таксономии? Нечувствительность к регистру add_rewrite_rules в функциях WordPress Redeclare функция в дочерней теме wp_editor на передней панели – JavaScripts не включены как иметь только один пост post post post? Как исправить двойную косую черту в пользовательских константах с иерархической таксономией? Как вставить в очередь стиль с помощью wp_enqueue_style ()

wp_delete_auto_drafts () удаляет ссылки в меню

Со вчерашнего дня wp_scheduled_auto_draft_delete cron wp_scheduled_auto_draft_delete каким-то образом удаляет все записи страниц из наших меню. Все записи в таблице wp_postmeta с meta_key = '_menu_item_object' и meta_value = 'page' удаляются в процессе. Проследив запрос DELETE, я узнал, что записи меню удаляются функцией _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 пытается удалить эти строки, вот как мы прибили нашу ошибку ,

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

  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

Это то, что обычный запрос, выполняемый 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 нет никаких дел, мешающих _stealth-publish элементов навигационного меню.