Общий функционал в плагинах и темах

8

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

Иногда я думаю о том, чтобы проверить, существует ли функция / класс перед объявлением, как сказано в этом посте: Когда проверять, существует ли функция

Но это считается плохой практикой. Как лучше всего предотвращать конфликты и поддерживать работу тем и плагинов независимо друг от друга, не устанавливая темы / плагин?

Джег Багус
источник

Ответы:

12

Действия и фильтры

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

Пример № 1

Вот небольшой плагин, чтобы проверить это.

<?php 
/** Plugin Name: (#68117) Print Hello! */
function wpse68117_print_hello()
{
    echo "Hello World!";
}
add_action( 'wpse68117_say', 'wpse68117_print_hello' );

Внутри темы:

<?php
/** Template Name: Test »Print Hello!« Plugin */
get_header();
// Now we call the plugins hook
do_action( 'wpse68117_say' );

Что теперь происходит / The kool kid

Таким образом, нам не нужно проверять существование функции, файла, класса, метода или, может быть, даже глобального (не делайте этого!) $variable. WP intern global уже принимает это за нас: проверяет, является ли имя ловушки текущим фильтром, и присоединяет его. Если его не существует, ничего не происходит.

Пример № 2

С нашим следующим плагином мы присоединяем функцию обратного вызова, которая принимает один аргумент.

<?php 
/** Plugin Name: (#68117) Print Thing! */
function wpse68117_print_thing_cb( $thing )
{
    return "Hello {$thing}!";
}
add_filter( 'wpse68117_say_thing', 'wpse68117_print_thing_cb' );

Внутри темы:

<?php
/** Template Name: Test »Print Thing!« Plugin */
get_header();
// Now we call the plugins hook
echo apply_filter( 'wpse68117_say_thing', 'World' );

На этот раз мы предлагаем пользователю / разработчику возможность добавить аргумент. Он может либо echo/printвыводить данные, либо даже обрабатывать их дальше (в случае, если вы получили взамен массив).

Пример № 3

С третьим плагином мы прикрепляем функцию обратного вызова, которая принимает два аргумента.

<?php 
/** Plugin Name: (#68117) Print Alot! */
function wpse68117_alot_cb( $thing, $belongs = 'is mine' )
{
    return "Hello! The {$thing} {$belongs}";
}
add_filter( 'wpse68117_grab_it', 'wpse68117_alot_cb' );

Внутри темы:

<?php
/** Template Name: Test »Print Alot!« Plugin */
get_header();
// Now we call the plugins hook
$string_arr = implode(
     " "
    ,apply_filter( 'wpse68117_grab_it', 'World', 'is yours' )
);
foreach ( $string_arr as $part )
{
     // Highlight the $thing
     if ( strstr( 'World', $part ) 
     {
         echo "<mark>{$part} </mark>";
         continue;
     }
     echo "{$part} ";
}

Этот плагин теперь позволяет нам вставить два аргумента. Мы можем сохранить его в $variableи обработать дальше.

Вывод

Используя фильтры и действия, вы повышаете производительность, избегая ненужных проверок (сравнивайте скорость function_*/class_*/method_*/file_existsили выполняйте поиск по всему миру с in_array()~ 1k (?) Поисками фильтра). Вы также избегаете иметь все эти ненужные уведомления для неустановленных переменных и т. Д., Так как плагин заботится об этом.

кайзер
источник
2
Отличное понимание темы лучшей практики!
Адам
1
Спасибо, Кайзер, вы пришли с наилучшей возможной практикой по этим вопросам. еще раз спасибо!
Джег Багус
Кстати, нам нужно дать другое имя для той же функциональности, совместно используемой плагином и темами, верно?
Джег Багус
Допустим, у меня есть функция, которую я вызываю jlog, которая будет выполнять простое преобразование предварительно в переменную и печатать содержимое этой переменной. я добавляю функцию jlog на темы и плагин, как я могу предотвратить любой конфликт?
Джег Багус
1
@JegBagus Вы очень запутанный человек :) Пожалуйста, обновите ваш вопрос точными функциями и объясните, что они делают и где они должны что-то делать. И, пожалуйста, уберите ваши комментарии здесь. Спасибо.
Кайзер