Вопрос или проблема
Я использую функцию настройки WordPress для конфигурации своей темы, и постоянно сталкиваюсь с одной и той же раздражающей проблемой: иногда я не получаю никаких значений от get_theme_mod, хотя вижу эффект своих изменений в окне предпросмотра.
Вот некоторый код:
$active_type="home";
$wp_customize->add_setting($active_type.'_categories_max',array(
'default' => '10',
'transport' => 'refresh'
));
$wp_customize->add_control( $active_type.'_categories_max',array(
'type' => 'select',
'label' => 'Макс. элементы',
'section' => $active_type.'_categories_section',
'choices' => array(
'5' => '2',
'10' => '10',
'15' => '15',
'20' => '20',
),
));
На моей PHP-странице у меня есть:
$test = get_theme_mod('home_categories_max');
echo $test;
Когда я в настройщике, каждый раз, когда я меняю значение, я вижу правильное значение в окне предпросмотра. Если я сохраняю и затем напрямую перехожу на страницу (без настроек), я не всегда получаю значение. Иногда я получаю его сразу, иногда вообще не получаю, не меняя ничего в коде.
Сначала я думал, что это проблема кэширования, но очистка кэша на сервере и в браузере не решила проблему. Если я сохраняю значение, выхожу из настроек, а затем возвращаюсь, я вижу, что значение сохранено, но get_theme_mod все равно возвращает пустое значение.
Я действительно не вижу, что не так с моим кодом, так как он иногда работает без каких-либо изменений.
У вас есть какое-нибудь представление?
Спасибо
Лорен
ОБНОВЛЕНИЕ 28/12:
Я вижу две проблемы.
-
Не удается сохранить
Когда я нажимаю кнопку «Сохранить и опубликовать», появляется значок «занято», затем исчезает, но кнопка «Сохранить и опубликовать» остается неизменной. Если я проверяю базу данных, ничего не было обновлено. -
Сохранено в БД, но не видно
Когда я вижу правильную запись в базе данных, как эта:{ "2016-Foundation6-v0.6::single_categories_location_priority": { "value": "0", "type": "theme_mod", "user_id": 1 } }
Иногда я не получаю значения при использовании get_theme_mod.
Еще одна вещь
Я заметил, что мой уровень успеха был выше, когда я вносил только одно изменение. Скажем, я впервые захожу в настраиватель, изменяю одну вещь и сохраняю, я получаю это:
{"success":true,"data":{"setting_validities":{"single_carousel_location":true},"changeset_status":"publish"
,"next_changeset_uuid":"9aff0388-b0bc-4be8-ba1a-2fd3cf24772c"}}
Если я пытаюсь внести другие изменения (не связанные с первым), я получаю такое сообщение:
{"success":false,"data":{"message":"","code":"changeset_already_published","data":null}}
Если я снова уйду, вернусь в настраиватель и сделаю одно изменение и сохраню, это обычно срабатывает.
Я не изменил ни строчки кода за весь процесс.
Это действительно просто. set_theme_mod
File: /wp-includes/theme.php
889: function set_theme_mod( $name, $value ) {
890: $mods = get_theme_mods();
891: $old_value = isset( $mods[ $name ] ) ? $mods[ $name ] : false;
892:
893: /**
894: * Фильтрует значение темы при сохранении.
895: *
896: * Динамическая часть имени хука, `$name`, относится к ключу массива
897: * модификации. Например, 'header_textcolor', 'header_image' и так далее
898: * в зависимости от параметров темы.
899: *
900: * @since 3.9.0
901: *
902: * @param string $value Новое значение модификации темы.
903: * @param string $old_value Текущее значение модификации темы.
904: */
905: $mods[ $name ] = apply_filters( "pre_set_theme_mod_{$name}", $value, $old_value );
906:
907: $theme = get_option( 'stylesheet' );
908: update_option( "theme_mods_$theme", $mods );
909: }
Это будет сохранено в таблице параметров theme_mods_$theme
, где $theme
– это название вашей темы. Но это не произойдет, пока вы не нажмете кнопку Сохранить и опубликовать в настраивателе.
Страница предпросмотра как земля мечты (Лат: Et est fallacia lunae).
Что бы вы ни делали, значения не будут сохранены в базе данных.
И я думаю, что это единственная проблема, с которой вы сталкиваетесь.
Я продублировал то, что у вас есть на вашей стороне.
Могу подтвердить, что я могу сохранять значения каждый раз.
function _20161230_customize_register( $wp_customize ) {
$active_type="home";
$wp_customize->add_section( $active_type. 'just_listed' , array(
'title' => __( 'Настройки только что добавленных', 'microformata' ),
'priority' => 53,
) );
$wp_customize->add_setting($active_type.'_categories_max',array(
'default' => '10',
'transport' => 'refresh'
));
$wp_customize->add_control( $active_type.'_categories_max',array(
'type' => 'select',
'label' => 'Макс. элементы',
'section' => $active_type.'just_listed',
'choices' => array(
'5' => '2',
'10' => '10',
'15' => '15',
'20' => '20',
),
));
}
add_action( 'customize_register', '_20161230_customize_register' );
Результат Ajax будет выглядеть так:
{success: true, data: {setting_validities: {home_categories_max: true}, changeset_status: "publish",…}}
data
:
{setting_validities: {home_categories_max: true}, changeset_status: "publish",…}
changeset_status
:
"publish"
next_changeset_uuid
:
"4b1ac702-3ae2-422d-875a-a02b6f5b2d65"
setting_validities
:
{home_categories_max: true}
success
:
true
Что я не уверен, можете ли вы отключить используемые вами плагины и затем протестировать.
Я знаю, что вы используете 4.7, судя по сообщению об ошибке, которое вы получили.
Ответ или решение
Проблема с тем, что функция get_theme_mod
не всегда возвращает ожидаемое значение, может быть вызвана несколькими факторами. Давайте разберем возможные причины и их решения.
Возможные причины проблемы
-
Кэширование: Если у вас включено кэширование на стороне сервера или используете плагины для кэширования, это может вызывать проблемы с отображением обновленных настроек. Хотя вы уже выполнили очистку кэша, стоит попробовать временно отключить все плагины кэширования и повторно протестировать.
-
Проблемы с загрузкой в админке: Из вашего описания видно, что при нажатии на кнопку "Сохранить и опубликовать" иногда не происходит обновление значений в базе данных. Это может быть связано с ошибками в Javascript на странице или конфликтом с другими плагинами, которые могут блокировать AJAX-запросы.
-
Ошибки в коде: Убедитесь, что идентификатор настройки, который вы используете в
get_theme_mod
, соответствует тому, который вы добавляете вadd_setting
. Например, в вашем случае вы используетеhome_categories_max
, поэтому убедитесь, что вы добавили настройки с таким же именем.
Решения
-
Тестирование без плагинов: Попробуйте временно отключить все плагины и переключиться на стандартную тему WordPress (например, Twenty Twenty-One). Это поможет определить, не вызывают ли конфликт сторонние компоненты.
-
Проверка консоли разработчика: Oткройте инструменты разработчика (F12) в вашем браузере и проверьте вкладку "Консоль" на наличие ошибок JavaScript, которые могут мешать корректному функционированию интерфейса кастомизатора.
-
Прослушивание событий сохранения: Вы можете добавить обработчик событий для отслеживания успешного сохранения настроек кастомизатора. Добавьте следующий код в ваш файл
functions.php
:function customizer_enqueue_scripts() { wp_enqueue_script('customizer-js', get_template_directory_uri() . '/js/customizer.js', array('jquery', 'customize-preview'), null, true); } add_action('customize_preview_init', 'customizer_enqueue_scripts');
В файле
customizer.js
добавьте:(function($) { wp.customize.bind('saved', function() { alert('Настройки успешно сохранены!'); }); })(jQuery);
-
Проверка обновления настроек в базе данных: Используйте инструмент phpMyAdmin для проверки, записываются ли значения в таблицу
wp_options
. Найдите строку с ключом, начинающимся наtheme_mods_
, и убедитесь, что ваши настройки обновляются в базе данных.
Заключение
Если после выполнения всех вышеописанных шагов проблема сохраняется, возможно, стоит обратиться к разработчику вашей темы или на специализированные форумы, такие как WordPress.org. Убедитесь, что ваша версия WordPress обновлена до последней стабильной версии. Очень важно также следить за обновлениями плагинов и тем, так как старые версии могут содержать ошибки, которые уже исправлены в новых.
Если у вас остались вопросы или требуется дополнительная помощь, не стесняйтесь обращаться!