Пункты меню навигации исчезают (но не сразу)

7 сент. 2012 г., 15:40:42
Просмотры: 3.06K
Голосов: 1

Я работаю над сайтом, где некоторые пункты меню навигации исчезают (из фронтенда, бэкенда и базы данных). Однако отладка крайне затруднена, так как они исчезают не сразу! В результате я не могу понять, что вызывает их удаление.

Дополнительная информация:

  • Похоже, что пункты меню типа 'custom' (например, ссылки на произвольные URL, а не на записи/страницы/рубрики и т.д.) могут быть в безопасности. Я пока не уверен на 100%.
  • В какой-то момент новые пункты меню не сохранялись - я добавлял несколько пунктов в меню, нажимал "Сохранить меню", но меню сохранялось без пунктов.

Есть какие-то предложения по отладке этой крайне раздражающей проблемы?

Версия WordPress 3.4.1. Я только что обновился до 3.4.2, но пока не могу проверить, сохраняется ли проблема (хотя у меня нет оснований полагать, что она исчезла).

Редактирование: Я подтвердил, что "custom" пункты меню (ссылки на произвольные URL, а не на страницы/рубрики WordPress и т.д.) не удаляются.

7
Комментарии

Проверили Тикет #14134?

fuxia fuxia
7 сент. 2012 г. 15:46:29

К сожалению, это не та ошибка - это происходит всего с несколькими пунктами меню.

Travis Northcutt Travis Northcutt
7 сент. 2012 г. 16:08:53

происходит ли это при выключенном javascript?

ifdion ifdion
8 сент. 2012 г. 01:36:41

@ifdion - какое отношение имеет javascript к удалению элементов из базы данных?

Travis Northcutt Travis Northcutt
12 сент. 2012 г. 18:56:52

моя ошибка, подумал, что они исчезают только во фронтенде

ifdion ifdion
12 сент. 2012 г. 22:24:42

Удаляются все не-пользовательские элементы навигации? Или только определенные?

jessica jessica
14 сент. 2012 г. 17:06:27

Может ли это быть php_value max_input_vars?

Brad Dalton Brad Dalton
18 нояб. 2014 г. 17:04:37
Показать остальные 2 комментариев
Все ответы на вопрос 2
0

Логирование запросов

Как сказано в вопросе "это происходит не всегда", трудно определить, что на самом деле происходит. Когда вы не видите, что происходит (запрос в фоне) и не знаете, когда это происходит, лучше всего записывать это в лог.

Логгер

При активации плагин попытается создать каталог для логов с именем '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;
17 сент. 2012 г. 08:29:04
3

Вы деактивировали все установленные плагины?

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

Не забудьте записать текущие значения основных настроек перед их удалением при чистой установке.

12 сент. 2012 г. 19:52:22
Комментарии

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

Travis Northcutt Travis Northcutt
12 сент. 2012 г. 21:11:55

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

Ben Ben
13 сент. 2012 г. 05:41:00

Поскольку это не отвечает на вопрос... это должно быть комментарием, верно?

fuxia fuxia
16 сент. 2012 г. 14:18:19