В редакторе отсутствуют некоторые страницы из выбранной родительской страницы.

Вопрос или проблема

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

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

Например, если я смотрю в базе данных на дочернюю страницу, то post_parent установлен на правильный идентификатор родителя. И когда я просматриваю дочернюю страницу или её родительскую страницу на фронтенде, в иерархическом левом навигационном меню показываются как родитель, так и все его дочерние страницы. Но когда я редактирую дочернюю страницу, там написано, что родительская страница — (нет родителя).

Я уже:

  • Проверил, что REST API включен (запрос REST API отображает их корректно)
  • Проверил postmeta (у них такие же postmeta, как у работающих страниц)
  • Проверил таксономии (таксономии не назначены этим страницам или работающим страницам)
  • Проверил настройки Yoast (они не имеют noindex или nofollow)
  • Деактивировал все плагины
  • Переключился на тему Twenty Twenty
  • Жестко обновил редактор каждый раз
  • Удалил одну из страниц, воссоздал её с тем же слагом и увидел, что новая страница появилась как родительская страница в выпадающем меню

У меня была та же проблема на сайте, к которому я унаследовал обязанности разработчика. Я обнаружил, что при отключенном плагине Classic Editor, хотя родительские страницы все еще отсутствовали в выпадающем меню, я смог ввести их в атрибуты (при включенном плагине Classic Editor прямая ввод не была возможна), и они были доступны для поиска и установки. Это не решение, но временное решение через панель управления WordPress, а не через mysql.

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

Основная проблема, как помог мне выяснить Elex, заключается в том, что REST API запрашивает максимум 100 страниц за раз. У этого сайта было несколько сотен страниц, и поэтому только 100 из них отображались за раз в выпадающем меню.

Публикация новой страницы и добавление её в качестве родителя для старых дочерних страниц работают потому, что это означает, что идентификатор новой страницы достаточно высок, чтобы быть включенным в запрос на 100 страниц. Он берет 100 самых высоких идентификаторов.

У меня была та же проблема при использовании конструктора страниц WP Bakery. В WP Bakery есть опция «отключить редактор Гутенберг».

По какой-то странной причине, когда я отключил Гутенберг, все правильные страницы стали видимыми, и отсутствующие страницы появились в выпадающем меню «Родительские страницы». Я подозреваю, что эта проблема была связана с редактором Гутенберг, и при его отключении, казалось, проблема решалась.

Максимальный запрос страниц REST API можно вручную увеличить выше зашитого лимита в 100 элементов в WordPress 6.6.2 (en_US), внесением изменений в основные файлы WordPress (не рекомендуется для производственной среды, но вполне возможно) и с помощью фильтра «rest_page_collection_params».

[Важно] Решение ниже предназначено только для образовательных целей и тех, кто готов принять на себя ответственность за резервное копирование и восстановление (если это необходимо) всего веб-сайта.

[Предупреждение] Решение ниже не является постоянным. Как только WordPress обновится, оно отменит внесенные изменения.

[Преимущество] Решение ниже позволит вам выполнить задачу (выбрать любую существующую родительскую страницу в выпадающем списке редактора блоков). Лимит элементов страницы будет увеличен с 100 до 9876 элементов. Затем его можно вернуть обратно, вернув оригинальный файл и удалив фильтр.

[Цель-1] При редактировании страницы и отображении содержимого блока «Список страниц» отображать все страницы и не ограничиваться жесткой кодировкой JSON с ограничением 100 элементов.

Например: существуют другие дочерние страницы под настройкой ‘Список страниц’ -> ‘Родитель’, указывающей на страницу ‘DataMates Foundation’ в качестве родителя для фильтра блока… Но только одна страница отображается в блоке «Список страниц» при редактировании страницы.

Блок списка страниц не отображает все дочерние страницы в редакторе блоков

Это все дочерние страницы, которые должны отображаться, но поскольку страниц немного более 100, некоторые из них не включены. Смотрите скриншот выше.

Список страниц в админ-панели, доказывающий, что они должны отображаться в редакторе блоков и в выпадающем списке родительских страниц

[Цель-2] Блок «Список страниц» имеет атрибут «Родитель», который должен отображать ВСЕ страницы в выпадающем списке, доступных для выбора в качестве фильтра, который будет применен к списку страниц. Стандартное поведение WordPress 6.6.2 — отображать только до 100 элементов максимум. Для тех из нас, у кого более 100 страниц на сайте… такое принудительное поведение REST -> JSON является техническим ограничением, накладываемым в ущерб нормальному функционированию фильтра «Родитель» блока. Выпадающий список «Родитель» должен перечислять все страницы. Как это показано на скриншоте справа.

Желаемый результат — все дочерние страницы отображаются в редакторе блоков и в выпадающем списке родительских страниц редактора блоков

[Источник] Обзор исходного кода WordPress 6.6.2 en_US.

[Наблюдение] Определено в wp-includes/js/dist/block-library.js строка 39333.

const MAX_PAGE_COUNT = 100;

[Часть решения-А] Измените содержимое минимизированной версии этого файла… измените файл wp-includes/js/dist/block-library.min.js.

Подсказка: Минификация заменяет константу MAX_PAGE_COUNT на встроенное значение напрямую.

Строка 39417:

per_page: MAX_PAGE_COUNT,
_fields: ['id', 'link', 'menu_order', 'parent', 'title', 'type'],

Поиск по минимизированному JS:

per_page:100,_fields:

Заменить на минимизированный JS:

per_page:9876,_fields:

Первая модификация в block-library.min.js

Подсказка: Вы найдете этот второй результат поиска всего через несколько десятков символов, после вышеуказанного результата поиска.

Строка 39425:

pages?.length <= MAX_PAGE_COUNT

Поиск по минимизированному JS:

?.length<=100

Заменить на минимизированный JS:

?.length<=9876

Вторая модификация в block-library.min.js

[Часть решения-Б] Добавьте это в файл functions.php вашей темы.

function aFilterFor_rest_page_collection_params($params) {
    if (isset($params['per_page'])) {
        $params['per_page']['maximum'] = 9876;  // По умолчанию 100.
    }
    return $params;
}
add_filter('rest_page_collection_params', 'aFilterFor_rest_page_collection_params');

[Часть решения-В] Новое значение, 9876 в приведенном выше примере, должно быть тем же значением в измененном файле wp-includes/js/dist/block-library.min.js (Часть решения-А) и в файле functions.php (Часть решения-Б).

В противном случае это вызовет ошибку и будет выглядеть так.

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

[Часть решения-Г] Минифицированные файлы кэшируются в браузере. Вышеуказанное решение не показало, что оно работает, до тех пор, пока не было использовано новое инкогнито-окно браузера с совершенно новой сессией входа WordPress. Затем оно сработало; показав блок «Список страниц» в режиме редактирования, листая до 9876 элементов и также показывая все элементы, которые обычно не возвращаются в стандартном поведении с ограничением менее или равно 100.

[Успех-1] Блок «Список страниц» отображает все дочерние страницы (до нового максимума в 9876 страниц), когда мы используем редактор блоков при редактировании страницы.

Успех в отображении всех дочерних страниц в редакторе блоков для блока Список страниц

[Успех-2] Выпадающий список атрибута «Родитель» блока «Список страниц» теперь отображает все страницы в списке как доступный вариант для установки в качестве «Родителя» для фильтрации содержимого блока «Список страниц».

Успех в отображении всех страниц сайта в редакторе блоков для выпадающего списка родительских страниц блока Список страниц

[Наблюдение] Вышеуказанное решение заставляет поведение стандартной библиотеки блоков для запросов с фронтенда запрашивать более длинный список элементов и делать это всё сразу; увеличивая запрос ‘per_page’ и максимум, что не идеально в идеальном мире. Вышеуказанное решение является большим взрывом, позволяющим добиться рабочего решения, которое не использует поведение пагинации (идеальное решение потребовало бы дальнейших настроек, если это вообще возможно с учетом жестко закодированных ограничений WordPress 6.6.2).

[Заключение] Приведенное выше решение помогает вам выбрать любую страницу «Родитель» из выпадающего списка в редакторе блоков. Это неаккуратный шаг для продвинутых администраторов WordPress до тех пор, пока основной код WordPress не перестанет требовать такого рода ручного обхода для ограничения в 100 элементов REST API.

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

Ответ или решение

Проблема, с которой вы столкнулись, связана с ограничением в 100 страниц, которое применяется к выборке страниц в WordPress через REST API. В вашем случае это приводит к тому, что некоторые верхнеуровневые страницы, а также их дочерние страницы не отображаются в выпадающем списке "Родительская страница" в редакторе блоков (Gutenberg).

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

1. Проверьте статус публикации страниц

Убедитесь, что все страницы, которые вы хотите использовать как родительские, опубликованы. Страницы, находящиеся в статусе черновика или ожидающего рассмотрения, не будут отображаться в выпадающем списке.

2. Используйте временное решение с классическим редактором

Вы упомянули возможность ввода идентификаторов страниц вручную в классическом редакторе. Хотя это не является окончательным решением, это может помочь вам временно установить родительские страницы, пока вы решаете основную проблему.

3. Увеличьте лимит выборки REST API

Чтобы решить проблему с ограничением в 100 страниц, вы можете внести изменения в файлы вашего сайта.

Решение A: Изменение в JavaScript

Для изменения максимального количества страниц, которое будет возвращаться запросом, вам нужно будет внести изменения в файл block-library.min.js. Найдите строки, где определяется MAX_PAGE_COUNT, и измените его значение:

per_page: 9876,

Решение B: Используйте фильтры в functions.php

Добавьте следующий код в файл functions.php вашей темы для увеличения максимального количества страниц, которые могут быть возвращены:

function aFilterFor_rest_page_collection_params($params) {
    if (isset($params['per_page'])) {
        $params['per_page']['maximum'] = 9876;  // По умолчанию 100.
    }
    return $params;
}
add_filter('rest_page_collection_params', 'aFilterFor_rest_page_collection_params');

4. Очистите кэш браузера

После внесения изменений в файл JavaScript или в functions.php, откройте редактор на новой вкладке в режиме инкогнито, чтобы убедиться, что браузер не использует кэшированные версии скриптов.

5. Проверьте, работают ли изменения

После выполнения всех вышеуказанных шагов, вернитесь в редактор блоков и проверьте, отображаются ли ваши страницы в выпадающем списке "Родительская страница". Вы должны увидеть все верхнеуровневые страницы, включая те, которые отсутствовали ранее.

Заключение

Эти шаги должны помочь вам решить проблему с отсутствием некоторых страниц в выпадающем списке "Родительская страница" в редакторе Gutenberg. Важно помнить, что изменения в ядре WordPress, такие как упомянутые в Решении A, могут быть перезаписаны при обновлении WordPress, поэтому рекомендуется вести аккуратное управление этими изменениями и при необходимости повторно применять их после обновления.

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

Капча загружается...