it-swarm.com.ru

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

Я пытаюсь найти, что именно do_action и add_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 больше похож на файл ??? Если нет, пожалуйста, сообщите мне.

Благодарю.

12
Vignesh Pichamani

Причина, по которой он не печатал 100, потому что $regularprice внутри функции anothertest() является локальной для этой функции. Переменная $regularprice, используемая в родительской функции mainplugin_test(), не совпадает с переменной, используемой в функции anothertest(), они находятся в отдельной области видимости.

Поэтому вам нужно либо определить $regularprice в глобальной области (что не очень хорошая идея), либо вы можете передать аргумент в качестве параметра в do_action_ref_array . do_action_ref_array такой же, как do_action, вместо этого он принимает второй параметр как массив параметров.

Передавая в качестве аргумента:

function mainplugin_test() {

    $regularprice = 50;

    // passing as argument as reference
    do_action_ref_array('testinghook', array(&$regularprice));

    echo $regularprice; //It should print 100

}

// passing variable by reference
function anothertest(&$regularprice) {
    if(class_exists('rs_dynamic')) {
        $regularprice = 100;
    }
}
// remain same
add_action('testinghook','anothertest');
4
Rahil Wazir

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';
}

Вы также можете передать переменные в ловушку:

do_action( 'my_footer_hook', home_url( '/' ) );

Который вы можете использовать в функции обратного вызова:

add_action( 'my_footer_hook', 'my_footer_echo', 10, 1 );
function my_footer_echo( $url ){
    echo "The home url is $url";
}

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

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;
}

Ссылка

22
diggy

Фактически, add_action - это ловушка действия, которая используется для вызова действия (зарегистрированного обработчика) в определенной точке в зависимости от действия, а do_action используется для ручного вызова этого зарегистрированного действия. Например:

add_action('some_hook', 'handler_for_some_hook');

Этот обработчик будет вызываться, когда вы выполняете или скрипт выполняет some_action, но при желании вы можете вызвать это действие вручную, используя do_action. Итак, в основном do_action вызывает зарегистрированный хук действия, когда вы вызываете его. Проверьте больше на Кодекс .

2
The Alpha

// с помощью do_action мы создаем собственный тег (hook) для использования в wordpress Ex. Здесь я добавил 1 пользовательскую функцию для вызова этого В add_action я добавил имя функции с любым именем пользовательского тега С do_action (мое имя пользовательского тега)

function mywork()
{
    echo "display my name";
}

add_action('mytag','mywork');

do_action('mytag');

--- add_action () ---

специфичный для ловушки крючок, который будет влиять на функцию ()

 add_action( hook, **function**() )

Это изменит функциональность и поведение WordPress по конкретному «хуку», мы можем изменить его и метод функций.

0
Dhruv