Статьи

Добавление функций в ваш WordPress Theme Framework

В последней части этой серии вы добавили несколько хуков действий в ваш каркас темы. В этом уроке вы напишите некоторые функции, которые вы активируете с помощью этих хуков.

Если вы работали с примером кода, в вашей среде есть шесть хуков действий:

  • wptp_in_header , который находится справа от заголовка
  • wptp_before_content , который находится непосредственно перед циклом
  • wptp_after_content , который находится сразу после цикла
  • wptp_sidebar , который находится в sidebar.php
  • wptp_footer , который находится внутри элемента wptp_footer колонтитула
  • wptp_after_footer , который находится после элемента wptp_after_footer колонтитула.

В этом уроке я покажу вам, как добавить области виджетов для трех из них и пользовательскую функцию для последней.

Чтобы следовать этому уроку, вам понадобится:

  • установка для разработки WordPress
  • редактор кода
  • Если вы работаете с примером кода, используйте файлы кода из предыдущего урока. Вы можете получить к ним доступ, просмотрев учебник или через репозиторий GitHub для этой серии, ссылка на которую находится вверху этой страницы.

Первый шаг — добавить функцию для областей виджетов. Возможно, вы помните, что они изначально были закодированы в соответствующие файлы шаблонов; однако добавление их через функцию означает, что пользователи вашей платформы могут переопределить функцию позднее, либо полностью удалив области виджетов, либо заменив их чем-то другим.

Поскольку области виджетов добавляются с помощью функций, вы не кодируете их в соответствующих файлах шаблонов. Вы можете добавить их в свой файл functions.php , но для того, чтобы код был управляемым, я собираюсь добавить включаемый файл с кодом для областей виджетов.

Создайте папку с именем widgets.php в папке вашей темы и внутри widgets.php создайте файл с именем widgets.php . Сохраните файл.

Теперь откройте ваш файл functions.php и добавьте следующее перед вашими другими функциями:

1
2
// include for widgets
include( TEMPLATEPATH . ‘/includes/widgets.php’ );

Это эффективно вытягивает содержимое этого файла widgets.php в это место в вашем файле функций.

Теперь сохраните ваш файл функций.

Сначала давайте добавим область виджета в заголовок. Откройте новый файл widgets.php и добавьте это:

1
2
3
4
5
6
7
8
function wptp_in_header_widget_area() {
    if ( is_active_sidebar( ‘in-header-widget-area’ ) ) { ?>
        <aside class=»in-header widget-area» role=»complementary»>
            <?php dynamic_sidebar( ‘in-header-widget-area’ );
        </aside>
    <?php }
}
add_action( ‘wptp_in_header’, ‘wptp_in_header_widget_area’ );

Функция wptp_in_header_widget_area() добавляет код для области виджета в правильном месте. Сначала он проверяет, заполнена ли область виджетов виджетами, используя if( is_active_sidebar) , затем, если это так, выводит виджет в элементе aside .

Функция активируется через wptp_in_header действия wptp_in_header который вы добавили в файл header.php в последнем уроке. Это заменяет код для области виджета, который был первоначально в header.php .

Выполнение этого означает, что если вы хотите удалить область виджетов для сайта, работающего на дочерней теме, вы можете сделать это с помощью remove_action() , например, так:

1
remove_action( ‘wptp_in_header’, ‘wptp_in_header_widget_area’ );

Это также означает, что вы можете добавить дополнительные функции, которые активируются через тот же хук, поэтому, если вы хотите добавить, например, кнопку вызова к действию над областью виджета, вы должны создать функцию, содержащую код, а затем прикрепить ее к wptp_in_header действия wptp_in_header с приоритетом меньше 10, так как это приоритет по умолчанию, который будет дан выше функции области виджета. Функции с более низким значением их приоритета запускаются первыми.

1
2
3
4
function wptp_add_cta() {
    //code for cta here
}
add_action( ‘wptp_in_header’ , ‘wttp_add_cta’, 5 );

Обратите внимание, что вы можете узнать больше о функции add_action() в Кодексе WordPress .

Следующим шагом является добавление области виджетов на боковой панели, используя аналогичный фрагмент кода, который вы также добавляете в свой файл widgets.php :

1
2
3
4
5
6
7
8
function wptp_sidebar_widget_area() {
    if ( is_active_sidebar( ‘sidebar-widget-area’ ) ) { ?>
        <aside class=»sidebar widget-area» role=»complementary»>
            <?php dynamic_sidebar( ‘sidebar-widget-area’ );
        </aside>
    <?php }
}
add_action( ‘wptp_sidebar’, ‘wptp_sidebar_widget_area’ );

Это добавляет область виджета на боковой панели, если она заполнена, с соответствующими классами, чтобы идентифицировать ее для стиля.

Наконец, давайте добавим виджеты в нижний колонтитул. Я собираюсь добавить четыре области виджета нижнего колонтитула — вы можете решить добавить меньше, если это все, что требует ваша структура. Мои области виджетов используют классы, которые используют объектно-ориентированный CSS в моей теме.

Снова в widgets.php добавьте следующее:

01
02
03
04
05
06
07
08
09
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
function wptp_footer_widget_area() { ?>
 
    <aside class=»fatfooter» role=»complementary»>
 
        <?php
        // the first widget area
        if ( is_active_sidebar( ‘first-footer-widget-area’ ) ) { ?>
            <aside class=»first quarter left widget-area»>
                <?php dynamic_sidebar( ‘first-footer-widget-area’ );
            </aside><!— .first .widget-area —>
        <?php }
         
        // the second widget area
        if ( is_active_sidebar( ‘second-footer-widget-area’ ) ) { ?>
            <aside class=»second quarter widget-area»>
                <?php dynamic_sidebar( ‘second-footer-widget-area’ );
            </aside><!— .first .widget-area —>
        <?php }
     
        // the third widget area
        if ( is_active_sidebar( ‘third-footer-widget-area’ ) ) { ?>
            <aside class=»third quarter widget-area»>
                <?php dynamic_sidebar( ‘third-footer-widget-area’ );
            </aside><!— .first .widget-area —>
        <?php }
     
        // the fourth widget area
        if ( is_active_sidebar( ‘fourth-footer-widget-area’ ) ) { ?>
            <aside class=»fourth right quarter widget-area»>
                <?php dynamic_sidebar( ‘fourth-footer-widget-area’ );
            </aside><!— .first .widget-area —>
        <?php } ?>
     
    </aside>
 
<?php
}
add_action( ‘wptp_footer’, ‘wptp_footer_widget_area’ );

Это добавляет четыре области виджета в элементе fatfooter классом fatfooter — в моей теме это используется для стилей, то есть фон полной ширины может быть применен к элементу aside.fatfooter footer то время aside.fatfooter элемент aside.fatfooter может быть центрирован на экране. ,

Добавив некоторые виджеты в мои области виджетов, вы можете увидеть, как выглядит моя страница:

Помимо областей виджетов, я собираюсь добавить функцию к моей теме, которая вставляет текст для колофона. Это будет активировано через хук wptp_after_footer , поэтому он будет отображаться в самом низу экрана.

Поскольку это не виджет, я собираюсь добавить код в мой файл functions.php :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
function wptp_colophon() { ?>
    <section class=»colophon» role=»contentinfo»>
        <small class=»copyright half left»>
            &copy;
        </small><!— #copyright —>
     
        <small class=»credits half right»>
                <?php _e( ‘Proudly powered by’, ‘tutsplus’ );
            </a>
        </small><!— #credits —>
    </section><!—#colophon—>
 
<?php
}

Это добавляет элемент section, содержащий код для колофона. Теперь вы можете увидеть колофон на моем сайте:

Как вы можете видеть, текст по умолчанию для ссылки об авторских правах — это заголовок сайта. Если бы я захотел переопределить это в дочерней теме, я мог бы легко это сделать, создав новую функцию, подключенную к wptp_after_footer действий wptp_after_footer , и удалив исходную функцию с помощью remove_action() :

1
remove_action( ‘wptp_after_footer’, ‘wptp_colophon’ );

В качестве альтернативы я мог бы сделать мою исходную функцию подключаемой , что означает, что она не активируется, если WordPress уже встречал другую функцию с таким же именем (например, в дочерней теме). Я бы сделал это, поместив функцию в условную функцию, например так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
if ( ! function_exists( ‘wptp_colophon’ ) ) {
    function wptp_colophon() { ?>
        <section class=»colophon» role=»contentinfo»>
            <small class=»copyright half left»>
                &copy;
            </small><!— #copyright —>
         
            <small class=»credits half right»>
                    <?php _e( ‘Proudly powered by’, ‘tutsplus’ );
                </a>
            </small><!— #credits —>
        </section><!—#colophon—>
 
    <?php
    }
 
}
add_action( ‘wptp_after_footer’, ‘wptp_colophon’ );

Если я затем добавлю функцию с именем wptp_colophon в мою wptp_colophon тему, WordPress запустит ее, а не ту, что в родительской теме. Аккуратно, а?

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

Ваш фреймворк WordPress теперь имеет некоторые функции. В этом уроке я показал вам, как использовать хуки действий, которые вы создали ранее, для активации функций, которые вы добавляете в файл functions.php или во включаемый файл, который вы создаете в своей теме.

В первой части этой серии я упоминал, что зрелая тематическая структура — это больше, чем просто родительская тема: это экосистема. Это означает, что вы будете использовать ловушки действий в своей теме, чтобы активировать функции в плагинах, которые вы пишете специально для сайтов, работающих на тему или на ее дочерних элементах.

Многие из популярных фреймворков WordPress делают это, и нет никаких причин, почему вы не можете. Например, вы можете написать плагин для добавления пользовательских боковых панелей на сайт, а затем активировать его с помощью хука wptp_sidebar .

Это может быть полезно, если плагин используется более чем на одном сайте, поэтому вы будете дублировать свой код, если добавите его в соответствующие дочерние темы. Я сделал это сам, когда сайту нужна была боковая панель со списком страниц в той же части иерархии страниц сайта — это общий код, который полезен для нескольких сайтов.

В следующей части этой серии вы узнаете, как сделать следующий шаг, и добавите ловушки фильтров в вашу среду.