Как работают do_action и add_action в WordPress?

ВОПРОС

Я не очень хорошо понимаю принцип работы do_action и add_action и для чего они предназначены. До этого мне уже приходилось работать с последней, но do_action для меня что-то новое. Раньше я использовал этот код:

function mainplugin_test() {
$regularprice = 50;
if(class_exists(‘rs_dynamic’)) {
$regularprice = 100;
}
// and doing further
//like i echoing the regular price
echo $regularprice; //It print 100 from this code
}

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

function mainplugin_test() {
$regularprice = 50;
do_action(‘testinghook’);
// and doing further
//like i echoing the regular price
echo $regularprice; //It should print 100 but it print 50
}

Поэтому я решил указать еще одну функцию, которая должна указывать на этот хук:

function anothertest() {
if(class_exists(‘rs_dynamic’)) {
$regularprice = 100;
}
}
add_action(‘testinghook’,’anothertest’);

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

ОТВЕТ

Привет, сейчас я тебе об этом расскажу. Смотри, do_action – это перехватчик действия, а add_action – это то, что выполняет перехватывание, когда вызывается перехватчик. Надеюсь, я понятно объяснил.
На всякий случай приведу пример. В подвале своего сайта ты можешь добавить это:

do_action( ‘my_footer_hook’ );

И в этом месте ты можешь выводить содержимое из файла functions.php или из расширения при помощи следующего кода:

add_action( ‘my_footer_hook’, ‘my_footer_echo’ );
function my_footer_echo(){
echo ‘hello world’;
}

Насколько я понял, ты пытаешься отфильтровать значение на основе некоторых условий. И для этого нужно использовать фильтры-крючки:

function mainplugin_test() {
echo apply_filters( ‘my_price_filter’, 50 );
}
add_filter( ‘my_price_filter’, ‘modify_price’, 10, 1 );
function modify_price( $value ) {
if( class_exists( ‘rs_dynamic’ ) )
$value = 100;
return $value;
}

Я советую тебе подробнее почитать об этих функциях. К тому же, вся информация находится в открытом доступе.