- Вопрос или проблема
- Ответ или решение
- 1. Проверьте статус публикации страниц
- 2. Используйте временное решение с классическим редактором
- 3. Увеличьте лимит выборки REST API
- Решение A: Изменение в JavaScript
- Решение B: Используйте фильтры в functions.php
- 4. Очистите кэш браузера
- 5. Проверьте, работают ли изменения
- Заключение
Вопрос или проблема
Две мои страницы верхнего уровня и все их дочерние страницы отсутствуют в выпадающем меню в редакторе блоков для выбора родительской страницы.
В названиях и постоянных ссылках нет специальных символов. Все остальные мои страницы отображаются в выпадающем меню. На самом деле, эти две отсутствующие страницы верхнего уровня уже являются родителями для некоторых других моих страниц. Они ранее появлялись в выпадающем меню, и в базе данных все еще сохранены их идентификаторы. (Я не знаю, когда они перестали появляться в выпадающем меню.)
Например, если я смотрю в базе данных на дочернюю страницу, то 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:
Подсказка: Вы найдете этот второй результат поиска всего через несколько десятков символов, после вышеуказанного результата поиска.
Строка 39425:
pages?.length <= MAX_PAGE_COUNT
Поиск по минимизированному JS:
?.length<=100
Заменить на минимизированный JS:
?.length<=9876
[Часть решения-Б] Добавьте это в файл 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, поэтому рекомендуется вести аккуратное управление этими изменениями и при необходимости повторно применять их после обновления.