Get_theme_mod не извлекает значение

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

Я использую функцию настройки 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:

Я вижу две проблемы.

  1. Не удается сохранить
    Когда я нажимаю кнопку «Сохранить и опубликовать», появляется значок «занято», затем исчезает, но кнопка «Сохранить и опубликовать» остается неизменной. Если я проверяю базу данных, ничего не было обновлено.

  2. Сохранено в БД, но не видно
    Когда я вижу правильную запись в базе данных, как эта:

    {
      "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 не всегда возвращает ожидаемое значение, может быть вызвана несколькими факторами. Давайте разберем возможные причины и их решения.

Возможные причины проблемы

  1. Кэширование: Если у вас включено кэширование на стороне сервера или используете плагины для кэширования, это может вызывать проблемы с отображением обновленных настроек. Хотя вы уже выполнили очистку кэша, стоит попробовать временно отключить все плагины кэширования и повторно протестировать.

  2. Проблемы с загрузкой в админке: Из вашего описания видно, что при нажатии на кнопку "Сохранить и опубликовать" иногда не происходит обновление значений в базе данных. Это может быть связано с ошибками в Javascript на странице или конфликтом с другими плагинами, которые могут блокировать AJAX-запросы.

  3. Ошибки в коде: Убедитесь, что идентификатор настройки, который вы используете в get_theme_mod, соответствует тому, который вы добавляете в add_setting. Например, в вашем случае вы используете home_categories_max, поэтому убедитесь, что вы добавили настройки с таким же именем.

Решения

  1. Тестирование без плагинов: Попробуйте временно отключить все плагины и переключиться на стандартную тему WordPress (например, Twenty Twenty-One). Это поможет определить, не вызывают ли конфликт сторонние компоненты.

  2. Проверка консоли разработчика: Oткройте инструменты разработчика (F12) в вашем браузере и проверьте вкладку "Консоль" на наличие ошибок JavaScript, которые могут мешать корректному функционированию интерфейса кастомизатора.

  3. Прослушивание событий сохранения: Вы можете добавить обработчик событий для отслеживания успешного сохранения настроек кастомизатора. Добавьте следующий код в ваш файл 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);
  4. Проверка обновления настроек в базе данных: Используйте инструмент phpMyAdmin для проверки, записываются ли значения в таблицу wp_options. Найдите строку с ключом, начинающимся на theme_mods_, и убедитесь, что ваши настройки обновляются в базе данных.

Заключение

Если после выполнения всех вышеописанных шагов проблема сохраняется, возможно, стоит обратиться к разработчику вашей темы или на специализированные форумы, такие как WordPress.org. Убедитесь, что ваша версия WordPress обновлена до последней стабильной версии. Очень важно также следить за обновлениями плагинов и тем, так как старые версии могут содержать ошибки, которые уже исправлены в новых.

Если у вас остались вопросы или требуется дополнительная помощь, не стесняйтесь обращаться!

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

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