Сохранение настроек темы в дочерней теме

10

Мой клиент использует тему Карма с множеством настроек в настройках темы. Мне нужно сохранить свои CSS и PHP-дополнения в дочерней теме, чтобы обновления темы не стирали ее. Однако, когда я выбираю свою дочернюю тему в разделе «Внешний вид»> «Темы», все основные настройки темы исчезают.

Есть ли способ сохранить основные настройки темы?

drake035
источник
что ты имеешь в виду под "ушел"? Если вы можете переключиться обратно на родительскую тему и настройки там, то они не пропали
Марк Каплун
Ушел с приборной панели и сайта, то есть. Они все еще существуют где-то в базе данных, но это не относится к моей проблеме.
drake035
так в чем твоя проблема? вы спросили "Есть ли способ сохранить основные настройки темы?" и так как они все еще находятся в БД, они сохранены
Марк Каплун
«Сохраненный» означает присутствующий в детской теме. При переключении с родительской на дочернюю тему я хочу, чтобы дочерние настройки были такими же, как родительские настройки.
drake035
затем скопируйте их. Должен признаться, я до сих пор не понимаю, в чем именно заключается проблема, которую вы пытаетесь решить. звучит так, будто вы пытаетесь усложнить свою жизнь, или ваш подход к созданию дочерней темы неправильный, и вам лучше изменить родительскую тему (или может быть, что родительская тема не подходит для использования с дочерними темами)
Марк Каплун

Ответы:

10

Из-за того, что эти настройки темы хранятся в виде массива в базе данных, может быть сложно скопировать их, просто скопировав и вставив в phpmyadmin или с помощью какой-либо подобной тактики.

Команда опции WP CLI - ваш друг здесь. Если вы еще не используете WP CLI, проверьте это! Вот как я скопировал настройки из темы витрины в тему с названием storefront-sqcdy-child:

# save the existing theme settings in json format in a temporary text file
wp option get theme_mods_storefront --format=json > theme_mods_storefront.txt

# load the saved settings into the child theme option record in the database
wp option update theme_mods_storefront-sqcdy-child --format=json < theme_mods_storefront.txt

# cleanup the temp file
rm -f theme_mods_storefront.txt
squarecandy
источник
В качестве второй строки вы должны использовать параметр «труба тоже». Wp update theme_mods_storefront-sqcdy-child --format = json <theme_mods_storefront.txt
Грегор,
Да, я предполагаю, что это более стандартный способ сделать это ...
squarecandy
Привет, SquareCandy, вы сказали, что «может быть трудно скопировать их, просто скопировав и вставив», но операция, которую вы выполняете, кажется мне такой же. Я ошибаюсь?
Марко Паничи
@MarcoPanichi - это определенно отличается, потому что WP CLI делает кучу причудливых вещей, которые вы никогда не увидите десериализации / повторной сериализации данных надлежащим образом. Если вы просто скопируете значения и попробуете что-то изменить непосредственно в базе данных с помощью команд MySQL или phpmyadmin, вы, вероятно, все испортите.
SquareCandy
Я совершенно уверен, что с вашими командами получить [обновить] файл [из], вы делаете то же самое
Марко Паничи
6

Изменения темы Wordpress сохраняются в wp_optionsтаблице базы данных в theme_mods_{themename}поле. Вы можете скопировать его и переименовать, используя имя вашей дочерней темы.

andrejm
источник
1
А когда родительская тема обновляется и добавляет новые опции, что вы тогда делаете?
Марк Каплун
1
Какой вариант лучше @MarkKaplun? Я думаю, что это решает проблему, которую задает пользователь
Eoin
1
@ Вводите больше вопросов о дочерних темах, которые я читаю, и тем меньше мне нравятся их ограничения. Кажется, что для любого нетривиального изменения в родительской теме вам придется пересмотреть код дочерней темы. Если все, что вы делаете, это CSS, то это небольшая проблема, но для всего остального необходима переоценка. ОП здесь должен будет убедиться, что он синхронизирует параметры с родительской темой при каждом обновлении (в случае добавления новой опции с непустым значением по умолчанию). Я выступаю против использования дочерних тем и вместо этого использую git для ветвления «родителя» и объединения при появлении обновлений.
Марк Каплун
Когда вы говорите, переименуйте, используя имя дочерней темы, какое конкретное имя вы имеете в виду? Я не понимаю, откуда взять название дочерней темы.
@fuddin имя темы - это имя папки дочерней темы; например: настройки родительской темы идентифицируются как имя_опции 'theme_mods_parent-theme-name'; Настройки дочерней темы могут быть идентифицированы с помощью option_name 'theme_mods_parent-theme-name-child'. Вы можете выполнить выборку в своей базе данных, чтобы ясно это увидеть:SELECT * FROM wp_options WHERE option_name LIKE "theme_mods_%"
Марко Паничи
1

Я решил, просто скопировав параметры в базе данных .

Вот пошаговая процедура :

  1. Войдите в свой phpMyAdmin и выберите базу данных веб-сайта.
  2. Резервное копирование базы данных
  3. Выполните этот запрос, чтобы иметь четкое представление о ситуации SELECT * FROM wp_options WHERE option_name LIKE "theme_mods_%":; эта инструкция вернет строку для каждой темы, которую вы активировали на своем сайте до сих пор
  4. Измените строку настроек родительской темы, обозначенную как option_name = theme_mods_parent-theme-name
  5. Здесь, в поле option_value, у вас есть все настройки родительской темы в сериализованной форме; скопировать их; Вы можете использовать инструмент unserialize для просмотра контента в удобной для человека форме.
  6. Вернитесь к пункту 3, но теперь измените строку настроек дочерней темы
  7. Вставьте скопированные ранее настройки в поле option_value; спасти
Марко Паничи
источник
0

Вы можете сделать что-то вроде того, что включают в себя дочерние темы Genesis, чтобы сохранить настройки темы по умолчанию при активации и переключении тем:

//* Theme Setting Defaults
add_filter( 'genesis_theme_settings_defaults', 'child_theme_defaults' );
function child_theme_defaults( $defaults ) {

    $defaults['blog_cat_num']              = 6;
    $defaults['content_archive']           = 'full';
    $defaults['content_archive_limit']     = 150;
    $defaults['content_archive_thumbnail'] = 0;
    $defaults['image_alignment']           = '';
    $defaults['image_size']                = 'entry-image';
    $defaults['posts_nav']                 = 'prev-next';
    $defaults['site_layout']               = 'full-width-content';

    return $defaults;

}

//* Theme Setup
add_action( 'after_switch_theme', 'child_theme_setting_defaults' );
function child_theme_setting_defaults() {

    if( function_exists( 'genesis_update_settings' ) ) {

        genesis_update_settings( array(
            'blog_cat_num'              => 6,
            'content_archive'           => 'full',
            'content_archive_limit'     => 150,
            'content_archive_thumbnail' => 0,
            'image_alignment'           => '',
            'image_size'                => 'entry-image',
            'posts_nav'                 => 'prev-next',
            'site_layout'               => 'full-width-content',
        ) );

    } else {

        _genesis_update_settings( array(
            'blog_cat_num'              => 6,
            'content_archive'           => 'full',
            'content_archive_limit'     => 150,
            'content_archive_thumbnail' => 0,
            'image_alignment'           => '',
            'image_size'                => 'entry-image',
            'posts_nav'                 => 'prev-next',
            'site_layout'               => 'full-width-content',
        ) );

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

Брэд Далтон
источник