Уже не в первый раз меня просят помочь внести специфические изменения в дочерние темы Genesis. Действительно, изменение дочерней темы фреймворка является делом специфическим, подчиняющимся определённым правилам и отличающимся от правки обычной темы для WordPress. Чтож, как говорится, по просьбам трудящихся, и в частности, пользователя shurche, попробую раскрыть секреты глубокой настройки дочерних тем Genesis.
Для того чтобы понимать, что и как делать, необходимо знать и понимать как работают дочерние темы Genesis. Не углубляясь в дебри, попробую объяснить на пальцах основное – необходимое для понимания процесса внесения изменений.
Если открыть папку дочерней темы Genesis, откроется, на первый взгляд, довольно странная картина – файлов практически нет. А в самих файлах практически отсутствует HTML-код, только PHP слегка разбавленный HTML. Это означает, что дочерние темы сами не строят HTML выводимой страницы, а всю основную работу перекладывают на сам фреймворк, что является абсолютно правильным подходом. “Своими” у дочерней темы, обычно, являются файлы style.css, functions.php и home.php. Грубо говоря, алгоритм построения HTML страницы выглядит так:
- Загружается таблица стилей style.css.
- Загружаются и исполняются необходимые функции Genesis и текущей дочерней темы (functions.php)
- Строится HTML код страницы либо на базе дочерней темы. Если есть соответствующий шаблон (например home.php) то по шаблону дочерней темы, если нет – по дефолтному шаблону Genesis.
Кроме того в Genesis есть очень много “действий” (actions) и фильтров (filters), практически на любой случай. Исходя из всего вышесказанного можно сделать вывод: самый лучший способ внести специфические изменения в шаблон дочерней темы Genesis – это использовать встроенные actions и filters и делать это нужно в файле functions.php! Конечно, можно править и файлы шаблонов страниц темы, но что там править-то … Кода практически нет … А вот править дефолтные шаблоны Genesis я Вам крайне не советую. Во-первых, при обновлении Вы потеряете все внесённые изменения. Во-вторых, потеряете универсальность фреймворка – при смене темы придётся всё править заново.
Перейдём к конкретным примерам использования actions и filters в дочерних темах Genesis.
Фильтры
Начнём с фильтров. Задача: изменить строку копирайта в футере (убрать ссылки на StudioPress и вообще уменьшить количество ссылок – в оригинале их слишком много).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Customize the footer section add_filter('genesis_footer_creds_text', 'church_footer_creds_text'); function church_footer_creds_text($creds) { global $wpdb; $table = $wpdb->prefix . 'posts'; $lastDate = date('Y'); $firstDate = $wpdb->get_var("SELECT YEAR(post_date) FROM $table ORDER BY post_date LIMIT 1"); $text = get_bloginfo('name').'. '.__('All rights reserved', 'genesis').' · [footer_loginout]'; if($lastDate == $firstDate) $creds = "Copyright $firstDate, ".$text; else $creds = "Copyright © $firstDate - $lastDate, ".$text; return $creds; } |
Что было сделано …
Обычно строка копирайта выводится с помощью Genesis, именно Genesis а не дочерней темой, по заданному шаблону, но перед выводом применяется фильтр “genesis_footer_creds_text“, если обработчик фильтра определён, выводится “фильтрованный” текст, если нет – выводится текст заданный по-умолчанию. Я задал фильтру “genesis_footer_creds_text” обработчик – функцию “church_footer_creds_text” и сообщил об этом системе.
Согласно документации обработчик принимает один параметр (текст-оригинал) и должен возвратить переменную с обработанным текстом.
Для того, чтобы было интереснее, я привёл код реального обработчика фильтра из темы своего блога. Фильтр строит даты копирайта (год написания первой статьи – текущий год), имя блога, стандартная строка копирайта, ссылка на вход/выход (login/logout). Результат выполнения фильтра Вы можете увидеть в футере моего блога.
Полный список фильтров (filters) фреймворка Genesis можно найти на сайте StudioPress …
Действия (actions)
Обычно, в темах StudioPress первичное и вторичное меню навигации располагаются под областью заголовка – это одно из общепринятых расположений. Другое общепринятое расположение подразумевает расположение первичного меню над областью заголовка, а вторичного меню под областью заголовка. Если Вам вдруг захочется иметь такое расположение меню навигации, Вы можете сделать следующее:
1 2 |
remove_action('genesis_after_header', 'genesis_do_nav'); add_action('genesis_before_header', 'genesis_do_nav'); |
Что было сделано …
Всё очень просто … Я отключил вывод первичного меню навигации ниже области заголовка с помощью action genesis_after_header и включил вывод этого меню над областью заголовка с помощью action genesis_before_header. Вот и всё … И это действительно очень просто …
Полный список actions (hooks) фреймворка Genesis можно найти на сайте StudioPress …
Дополнительные параметры дочерней темы
Иногда появляется необходимость добавить один два параметра к параметрам изменённой темы. В этом тоже нет ничего сложного – всё уже предусмотрено.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// Add new box to the Genesis -> Theme Settings page add_action('admin_menu', 'church_add_settings_boxes', 11); function church_add_settings_boxes() { global $_genesis_theme_settings_pagehook; add_meta_box('genesis-theme-settings-themecolor', __('Theme Color', 'cc'), 'church_theme_settings_theme_color', $_genesis_theme_settings_pagehook, 'column2'); } function church_theme_settings_theme_color() { ?> <p> <label for="<?php echo GENESIS_SETTINGS_FIELD ?>[church_theme_color]"><?php _e('Select Theme Color:', 'genesis'); ?></label> <select name="<?php echo GENESIS_SETTINGS_FIELD ?>[church_theme_color]" id="<?php echo GENESIS_SETTINGS_FIELD ?>[church_theme_color]"> <option value="default" <?php selected('default', genesis_get_option('church_theme_color')); ?>><?php _e('Default', 'genesis'); ?></option> <option value="blue" <?php selected('blue', genesis_get_option('church_theme_color')); ?>><?php _e('Blue', 'genesis'); ?></option> <option value="gray" <?php selected('gray', genesis_get_option('church_theme_color')); ?>><?php _e('Gray', 'genesis'); ?></option> <option value="brown" <?php selected('brown', genesis_get_option('church_theme_color')); ?>><?php _e('Brown', 'genesis'); ?></option> </select> </p> <?php } // Add new default values for curch Theme Color add_filter('genesis_theme_settings_defaults', 'church_theme_color_defaults'); function church_theme_color_defaults($defaults) { $defaults['church_theme_color'] = 'default'; return $defaults; } /** * This function loads the stylesheet. * If a child theme is active, it loads the child theme's stylesheet, * otherwise, it loads the Genesis stylesheet. * */ remove_action('genesis_meta', 'genesis_load_stylesheet'); add_action('genesis_meta', 'church_load_stylesheet'); function church_load_stylesheet() { $color = genesis_get_option('church_theme_color'); if($color == 'default') echo '<link rel="stylesheet" href="'.get_bloginfo('stylesheet_url').'" type="text/css" media="screen" />'."\n"; else echo '<link rel="stylesheet" href="'.get_bloginfo('stylesheet_directory').'/'.$color.'.css'.'" type="text/css" media="screen" />'."\n"; } |
Что сделано …
Добавляем новый контейнер и новый параметр с помощью action WordPress “admin_menu” и функции add_meta_box. Затем определяем как будет выглядеть новый параметр на странице параметров с помощью HTML кода. Так же определяем значение по-умолчанию нового параметра с помощью фильтра “genesis_theme_settings_defaults“. И, конечно, определяем функцию для использования нового параметра. Это пример реального параметра написанного мной для использования нескольких тем цветового оформления в модифицированной теме Church Child 1.0. Для версии Church Child 1.1+ этот код не актуален, так как выбор цветовой схемы в версиях 1.1+ задан разработчиком …
Я не даю готовых рецептов, но надеюсь, что примеры, приведённые выше, помогут Вам настроить Вашу дочернюю тему Genesis именно так, как Вам это надо. Удачи!
© 2011 – 2017, minimus. Все права защищены. При копировании и републикации статьи, ссылка на первоисточник обязательна.
minimus я рад, что ты так быстро отреагировал на мое предложение. Сейчас пойду разбираться с блогом, надеюсь, что твой пост мне в этом поможет. Спасибо. А вообще, классные темы, некоторые вещи я так и не нашел как реализовать в других шаблонах. Мне очень нравится виджет последние темы с превью (картинкой). Если знаешь плагин для этого буду рад если подскажешь. Да кстати, ссылочку на тебя в новом блоге обязательно поставлю.
Супер, все получилось. Огромное спасибо. Успехов в развитии твоего блога.
Можно тебе задать еще вопрос по настройке? У меня начали появляться страницы такого вида:
/kurinoe-file-s-mango-i-krasnym-percem.html/kurinoe-file-s-mango-i-krasnym-percem содержащая картинку из статьи. Ты не знаешь с чем это связано? Мое предположение с тем что я настроил отображение страницы с html в конце. Если это из за этого может знаешь как убрать такие страницы или запретить их в роботсе?
Если честно, первый раз о таком слышу …
Пока разбираюсь. При добавлении картинки в статью у нее формируется путь не /wp-content/uploads/2011/09/ а как отдельная страница на блоге при чем я это заметил и на другом блоге. Когда я редактирую картинку в статье нажимаю ссылка на изображение то код меняется на тот, что нужно и получается все нормально. Получается это по тому что при добавлении картинки она сразу не добавляется на страницую Надо ее опять добавлять, но только она уже в галерее и по этому путь формируется не правильный. А вот почему она сразу в статью не добавляется не пойму. У меня такая фигня сразу на двух блогах новых появилась. Может такая проблема знакома?
День добрый!
Воспользовалась многими вашими рекомендациями, делая свой сайт (тема Church Child), за что огромное спасибо.
Но все еще остались некоторые вопросы.
В частности, не могу разобраться, почему в основном меню навигации дочерние страницы не выпадают списком, а “выползают” гармошкой. Подстраниц планируется сделать весьма приличное количество, и гармошка никак не уместна. Отказаться от дочерних страниц я не могу, но такой их вид в меню меня тоже не устраивает.
Что посоветуете?
Вы что-то изменили в style.css …
Спасибо, разобралась.)
Приветствую! Благодарю за полезную информацию по Genesis. У меня в процессе настройки некоторых тем, возникли трудности – при установке виджетов в область футера, они не отображаются при просмотре самой темы, хотя сама тема поддерживает наличие сайдбара в футере. Есть-ли решение этого вопроса? Может я что-то упустил во время настройки? Еще вопрос – подходит-ли Ваша русификация к последней версии Genesis? Заранее благодарен любому ответу.
1. Какую дочернюю тему Вы используете?
2. Да, подходит.
eleven40
Неплохая тема, но у меня её нет и не знаю, что Вам посоветовать … Высылайте по “мылу” – посмотрю что и как на тестовом блоге …
Отправил. Не возьметесь за русификацию bbpress, готов отблагодарить WMR. Русик от Genesis поставил – все просто замечательно, я правда сам перевел 50 %, все никак руки не доходили, а тут случайно на Ваш блог наткнулся, искал инфу по виджетам в футере…
bbPress по-русски
Был я уже там – русик не работает на последних версиях, у плагина структура даже другая..
Можно попробовать, но не знаю как быстро это получится: завтра уезжаю в деловую поездку на пару дней …
У Вас форум на каком плагине работает?
Это не плагин – это vBulletin …
Как вернетесь, стуканите 636340567 – будем договариваться..
Ok!
Добрый день, не подскажите, как убрать над постом Автора и его имя? Что-то обрыла post.php в structure и ничего не выходит…наверное где-то в другом месте прячется.
Спасибо! Давно искал, как удалить эти злосчастные ссылки с футера.
Да сложно без бутылки разобраться в такой теме. Спасибо за статью, самому бы пришлось родительскую тему кромсать.
Извините за глупый вопрос. Просто я вообще тупень в этом деле. Куда вставлять код фильтра в футере? Вот мой оригинальный код. (тема лайфсайл) Там, правда есть ссылка “к началу страницы”, которую мне не хотелось бы убирать, но если не получится, то ладно. Главное, поставить мой копирайт.
genesis_structural_wrap( ‘inner’, ‘</div><!– end .wrap –>’ );
echo ‘</div><!– end #inner –>’;
do_action( ‘genesis_before_footer’ );
do_action( ‘genesis_footer’ );
do_action( ‘genesis_after_footer’ );
?>
</div><!– end #wrap –>
<?php
wp_footer(); // we need this for plugins
do_action( ‘genesis_after’ );
?>
Спасибо вам в любом случае. Благодаря вам я создала свой блог, который говорят получился очень даже неплохо. И тема мне эта очень нравится.
Никуда в футере ставить не надо, надо вставить функцию в functions.php. Просто скопируйте код и вставьте…
Премного благодарен! Наконец-то избавился от ссылок в футере. Думал уж, придется шаблон менять.