Пункты меню навигации исчезают (но не сразу)
Я работаю над сайтом, где некоторые пункты меню навигации исчезают (из фронтенда, бэкенда и базы данных). Однако отладка крайне затруднена, так как они исчезают не сразу! В результате я не могу понять, что вызывает их удаление.
Дополнительная информация:
- Похоже, что пункты меню типа 'custom' (например, ссылки на произвольные URL, а не на записи/страницы/рубрики и т.д.) могут быть в безопасности. Я пока не уверен на 100%.
- В какой-то момент новые пункты меню не сохранялись - я добавлял несколько пунктов в меню, нажимал "Сохранить меню", но меню сохранялось без пунктов.
Есть какие-то предложения по отладке этой крайне раздражающей проблемы?
Версия WordPress 3.4.1. Я только что обновился до 3.4.2, но пока не могу проверить, сохраняется ли проблема (хотя у меня нет оснований полагать, что она исчезла).
Редактирование: Я подтвердил, что "custom" пункты меню (ссылки на произвольные URL, а не на страницы/рубрики WordPress и т.д.) не удаляются.

Логирование запросов
Как сказано в вопросе "это происходит не всегда", трудно определить, что на самом деле происходит. Когда вы не видите, что происходит (запрос в фоне) и не знаете, когда это происходит, лучше всего записывать это в лог.
Логгер
При активации плагин попытается создать каталог для логов с именем 'nav_log'
во временной папке - он выдаст и напечатает ошибку, если это не сработает.
Затем он попытается записать в файл с именем 'nav_log.txt'
внутри временной директории. Вы должны получить запись в логе каждый раз, когда срабатывает запрос для nav_menu_item
. Логи будут содержать префикс с датой (Y-m-d g:i:s
). Так что, если вы будете внимательны и попытаетесь отслеживать изменения в интерфейсе, вы сможете определить, когда это происходит. Я также добавил глобальную переменную $hook_suffix
(возможно) для определения момента, когда это происходит.
Примечание: Плагин требует доработки и не будет работать "из коробки". Работа с файловой системой сложна, и плагин представляет собой лишь набросок/идею.
<?php
! defined( 'ABSPATH' ) AND exit;
/** Plugin Name: (#64487) »kaiser« log nav menu query */
# Version: 2012-09-17.0924
if ( ! class_exists( 'wpse64487_query_logger' ) )
{
register_activation_hook( __FILE__, array( 'wpse64487_query_logger', 'create_log_dir' ) );
add_action( 'plugins_loaded', array( 'wpse64487_query_logger', 'init' ), 5 );
class wpse64487_query_logger
{
public static $instance;
public $name = 'nav_log';
public static function init()
{
null === self :: $instance AND self :: $instance = new self;
return self :: $instance;
}
public function __construct()
{
add_filter( 'posts_where', array( $this, 'ask_where' ) );
}
public function create_log_dir()
{
$output = true;
// Относительно временной директории
if ( ! wp_mkdir_p( $this->get_log_loc() ) )
$output = new WP_Error( __CLASS__, 'Не удалось создать каталог для логов.' );
is_wp_error( $output ) AND print $output->get_error_message( __CLASS__ );
}
public function get_log_loc( $full = false )
{
$output = trailingslashit( get_temp_dir()."{$this->name}" );
$full AND $output .= "{$this->name}.txt";
return $output;
}
public function ask_where( $where )
{
if ( "`post_type` = 'nav_menu_item'" === $where )
{
add_filter( 'posts_clauses', array( $this, 'catch_query' ) );
}
return $where;
}
public function catch_query( $pieces )
{
global $wp_filesystem, $hook_suffix;
$file = $this->get_log_loc( true );
$contents = $wp_filesystem->get_contents( $file );
// Добавляем текущий запрос
$contents .= "\n\n@".date( "Y-m-d g:i:s" );
$contents .= "\n Запрос: ".implode( ' ', $pieces );
$contents .= "\n Страница: {$hook_suffix}";
$wp_filesystem->put_contents(
$file
,$contents
,FS_CHMOD_FILE
);
return $pieces;
}
} // END Class wpse64487_query_logger
} // endif;

Вы деактивировали все установленные плагины?
Если вы уже попробовали это, и проблема сохраняется, то я не могу порекомендовать простое решение для данной установки. Но пробовали ли вы или даже задумывались о том, чтобы сделать резервную копию текущей установки, экспортировать контент в XML-файл и переустановить WordPress с чистой базой данных и без активированных плагинов, используя только желаемую тему? Новая установка должна содержать стандартные (не изменённые) файлы ядра. Перед импортом контента обратно попробуйте создать меню и проверить, сохраняется ли проблема. Если да, то можно исключить повреждённую базу данных, и, скорее всего, проблема кроется в файлах вашей темы.
Не забудьте записать текущие значения основных настроек перед их удалением при чистой установке.

У меня установлено всего несколько плагинов, и все они считаются "безопасными". Однако у меня много пользовательского кода в директориях темы и mu-plugins. Моя задача - разобраться, как отладить проблему, учитывая её случайный/периодический характер.

Хорошо, но я бы не исключал возможность повреждённой базы данных. Я не уверен, как это могло произойти или точно понять, как это может влиять на меню, но временные настройки (transient) в таблице options могут быть одной из возможных причин. Возможно, они были изменены в какой-то момент?
