it-swarm.com.ru

Лучший способ внедрения пользовательских разделов в тему WordPress

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

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

Спасибо,

Дэвид

4
David

Базовая парадигма в WordPress - это обработчик обратных вызовов. Действия, фильтры, виджеты, метабоксы и так далее ... все выполняется путем регистрации определенных обработчиков обратного вызова для некоторых триггеров. Это не всегда самый элегантный способ, но каждый новичок должен учиться, поэтому придерживайтесь этой парадигмы, когда вы не знаете, что делать.

Итак, предложите четыре действия:

do_action( 'home_primary_custom' );
do_action( 'home_secondary_custom_1' );
do_action( 'home_secondary_custom_2' );
do_action( 'home_secondary_custom_3' );

Затем вы или сторонний разработчик можете зарегистрировать обратный вызов для этих действий с помощью add_action().

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

$prefix = get_stylesheet();

$custom_actions = array (
    'home_primary_custom',
    'home_secondary_custom_1',
    'home_secondary_custom_2',
    'home_secondary_custom_3'
);

foreach ( $custom_actions as $custom_action )
    do_action( "$prefix_$custom_action" );

Теперь это может быть слишком длинным для простого шаблона, поэтому вы можете инкапсулировать код в пользовательскую функцию и зарегистрировать его для другого настраиваемого действия:

// front-page.php
do_action( get_stylesheet() . '_custom_front_actions' );

// functions.php

add_action( get_stylesheet() . '_custom_front_actions', 'custom_front_actions' );

/**
 * Execute custom front actions and print a container if there are any callbacks registered.
 *
 * @wp-hook get_stylesheet() . '_custom_front_actions'
 * @return bool
 */
function custom_front_actions()
{
    $has_callbacks  = FALSE;
    $prefix         = get_stylesheet();

    $custom_actions = array (
        'home_primary_custom',
        'home_secondary_custom_1',
        'home_secondary_custom_2',
        'home_secondary_custom_3'
    );

    // Are there any registered callbacks?
    foreach ( $custom_actions as $custom_action )
    {
        if ( has_action( "$prefix_$custom_action" ) )
        {
            $has_callbacks = TRUE;
            break;
        }
    }

    // No callbacks registered.
    if ( ! $has_callbacks )
        return FALSE;

    print '<div class="' . esc_attr( "$prefix-custom-front-box" ) . '">';

    foreach ( $custom_actions as $custom_action )
        do_action( "$prefix_$custom_action" );

    print '</div>';

    return TRUE;
}

Теперь вы можете распечатать пользовательский контейнер, только если зарегистрированы какие-либо обратные вызовы. Сторонние разработчики могут зарегистрировать свои собственные обратные вызовы или удалить свои. Вашему front-page.php нужна только одна дополнительная строка кода.

7
fuxia