Главная » Создание сайта на Wordpress, раскрутка сайта, поисковое продвижение и сопровождение

Не до конца грузится страница «Добавить страницу» в WordPress

Столкнулся я с одной весьма неприятной проблемой при использовании системы управления сайтом WordPress, которая заключалась в том, что страница Добавить страницу не загружалась до конца, а останавливалась лишь на этапе загрузки блока Атрибуты страницы, то есть прогружалось поле для тайтла, основной редактор, блок Опубликовать и заголовок блока Атрибуты страницы. Причем происходило это не постоянно и в редком случае страница все же прогружалась полностью. Та же проблема преследовала и страницу «Редактировать страницу» с теми же симптомами. Что же делать?

Не грузятся страницы Добавить страницу и Редактировать страницу в WordPress

Так же хотелось бы дополнить рассказ дополнительными симптомами, чем я и займусь в первую очередь:

  1. Сайт работает на VPS с 1 ГБ оперативной памяти с двухъядерным процессором под связкой Apache+Nginx+MySQL.
  2. На VPS сидят два сайта: этот блог и онлайн-кинотеатр, на котором и произошла ситуация. Оба сайта работают на WordPress.
  3. С добавлением страниц и редактированием страниц на втором сайте проблем не было никаких. С редактированием и добавлением записей на обоих сайта было все тип-топ.
  4. Эти первые пункты говорили о том, что проблема скорее всего не в сервере, а сугубо со страницами на втором сайте. Это подтверждалось тем, что за довольно короткое время количество страниц на сайте было увеличено от нескольких десятков до over 6000.
  5. С увеличением количества страниц увеличивалось и время построения страницы Добавить страницу или Редактировать страницу.

Насколько я помню, это были все симптомы и потому перехожу с рассмотрению моих жалких, но очень упорных и продолжительных попыток вернуть прежнюю работоспособность данным страницам:

  1. Чистка кэша браузера.
  2. Смена браузера.
  3. Чистка базы данных от мусора.
  4. Оптимизация базы данных.
  5. Отключение плагинов.
  6. Шаманские методы типа ждать прогрузки одной единственно этой страницы не трогая больше никаких других, даже на других сайтах.
  7. Обращение на форум ru.wordpress.org — получение совета о необходимости увеличить параметр конфигурации MySQL под названием max_allowed_packet от стандартных 1M на большее число. Параметр отвечает за максимальный размер передаваемого пакета. Но ни постепенно увеличение данного параметра, но подбрасывание его до 256М не привело ни к каким результатам.
  8. Началось знакомство с параметрами в файле конфигурации my.cnf СУБД MySQL, которые крутились и вертелись и так и сяк по несколько раз. Многие параметры увеличивались до 256М при том, что сама база висела около 80М. Настройки были подогнаны под рекомендации скриптов для тюнинга MySQL(mysqltuner.pl и tuning-primer.sh), а так же изучение всех этих параметров и проба различных вариантов заняло практически три дня(свободное время).
  9. Это было пиздец очень утомительно, но все же я нашел решение. И верным оказалось первое пришедшее на ум мысль(ну тогда, когда описываемая страница начала больше не грузится, нежели грузится) — покопаться в файле post-new.php, ведь именно он, сюда по адресной строке, был ответственен за вывод Добавить и Редактировать страницу.

Убираем пункт Родительская из блока Атрибуты страницы

Подзаголовок, думаю, раскрыл основную суть для тех, кто любит читать только выделенные места, а мы продолжим. Просмотрев код не до конца загруженной страница Добавить страницу и увидел, что загрузка закончилась на этапе:

<div id="pageparentdiv" class="postbox " >
<div class="handlediv" title="Нажмите, чтобы переключить">
</div><h3 class='hndle'><span>Атрибуты страницы</span></h3>
<div class="inside">

А полностью загрузив данную же страницу(попыток через десятую-двадцатую) я увидел что должно идти после данного отрезка кода. Увидев я сильно обрадовался, так как понял, что нашел причину всех проблем, ведь далее по коду было перечислено абсолютно все страницы сайта, каждый из которых мог бы стать «родителем» создаваемой страницы, благодаря соответствующему блоку Родительская, который предоставляет раскрывающийся список всех страниц. А теперь напомню, что это более 6000 страниц, которые в базе данных занимают чуть меньше 10 МБ. Разумеется, что вытягивать это дело каждый раз из базы данных было довольно затруднительно для СУБД MySQL(к сожалению я так и не узнал, об какую настройку MySQL спотыкался соответствующий запрос). Но оно и не нужно было мне. А так как полностью отказаться от блока Атрибуты страницы мне не позволяло немалое количество шаблонов для разных типов страниц, необходимо было щипцами выковырять соответствующий код из шаблона.

Благодаря помощи Total Commander и отрывку кода из соответствующей страницы было довольно скоро выявлен файл, отвечающий за вывод данного(а может и других) блоков. Это был файл по адресу

/wp-admin/includes/meta-boxes.php

Необходимый нам блок кода был следующим:

function page_attributes_meta_box($post) {
$post_type_object = get_post_type_object($post->post_type);
if ( $post_type_object->hierarchical ) {
$dropdown_args = array(
'post_type' => $post->post_type,
'exclude_tree' => $post->ID,
'selected' => $post->post_parent,
'name' => 'parent_id',
'show_option_none' => __('(no parent)'),
'sort_column' => 'menu_order, post_title',
'echo' => 0,
);

/**
* Filter the arguments used to generate a Pages drop-down element.
*
* @since 3.3.0
*
* @see wp_dropdown_pages()
*
* @param array $dropdown_args Array of arguments used to generate the pages drop-down.
* @param WP_Post $post The current WP_Post object.
*/
$dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post );
$pages = wp_dropdown_pages( $dropdown_args );
if ( ! empty($pages) ) {
?>
<p><strong><?php _e('Parent') ?></strong></p>
<label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
<?php echo $pages; ?>
<?php
} // end empty pages check
} // end hierarchical check.
if ( 'page' == $post->post_type && 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID ) {
$template = !empty($post->page_template) ? $post->page_template : false;
?>
<p><strong><?php _e('Template') ?></strong></p>

Как видите можно разглядеть тут строки Родительская(parent) и Шаблон(template) и понять, что это именно тот раздел. А вот команда

<?php echo $pages; ?>

явно ответственна за вывод списка всех страниц, а функция

$pages = wp_dropdown_pages( $dropdown_args );

за получение этого самого списка страниц. Комментировать эти строки не имеет смысла, так как они все равно будут выполнены и останутся лишь комментариями, потому необходимо почистить этот участок от самой функция вывода всех страниц. У меня получилось вот так:

function page_attributes_meta_box($post) {
$post_type_object = get_post_type_object($post->post_type);
?>
<p><strong><?php _e('Parent') ?></strong></p>
<label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>

<?php if ( 'page' == $post->post_type && 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID ) {
$template = !empty($post->page_template) ? $post->page_template : false;
?>
<p><strong><?php _e('Template') ?></strong></p>

Таким образом я полностью лишил себя всех своих проблем накапливаемых за последние месяцы, так как без данной функции(абсолютно не нужной мне в рамках данного проекта) страницы Добавить страницу и Редактировать страницу начала загружаться практически моментально, а ведь до того как стать совсем плохо, эти страницы открывались до 10 секунд.

Я пишу эту статью и улыбаюсь, я рад, что несмотря на три дня постоянного поиска решения не на той стороне и в тот момент, когда руки уже опустились, я сумел найти нужное решение. К тому же я неплохо стал разбираться в конфигурации MySQL, что тоже является определенным плюсом. У меня все.

2 комментариев к записи “Не до конца грузится страница «Добавить страницу» в WordPress
  1. Julia в cказал :

    Можно поставить все подобные скрипты в конец страницы – это уменьшит проблему, но не избавит от неё полностью, если скриптов несколько. Допустим, в конце страницы 3 скрипта, и первый из них тормозит – получается, другие два его будут ждать – тоже нехорошо.

    • admin в cказал :

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

Добавить комментарий

Ваш комментарий появится после модерации.