web-dev-qa-db-fra.com

Comment do_action et add_action fonctionnent-ils?

J'essaie de trouver ce qui fonctionne exactement avec do_action et add_action. J'examine déjà avec add_action mais pour do_action j'essaie comme nouveau maintenant. C'est ce que j'ai essayé.

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

}

Maintenant, au lieu de placer quelques codes dans le fichier principal, je prévois de créer do_action pour éviter les problèmes de code. 

    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

    }

donc j'ai créé une autre fonction pour souligner ce crochet comme quelque chose comme

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

Vous ne savez pas comment ajouter les lignes de code à ce hook pour que la fonction ci-dessus fonctionne? D'après ce que j'ai essayé dans mon environnement de test, rien n'y fait. Si je comprends bien do_action est plus comme inclure un fichier ??? Si ce n'est pas le cas, merci de me le dire.

Merci.

12

La raison pour laquelle il n'a pas imprimé 100, car $regularprice dans la fonction anothertest() est locale à cette fonction. La variable $regularprice utilisée dans la fonction parent mainplugin_test() n'est pas identique à la variable utilisée dans la fonction anothertest(); elles sont dans une portée distincte.

Vous devez donc définir le $regularprice dans une portée globale (ce qui n’est pas une bonne idée) ou vous pouvez passer l’argument en tant que paramètre à do_action_ref_array . Le do_action_ref_array est le même que do_action mais il accepte le deuxième paramètre en tant que tableau de paramètres.

Passer comme argument:

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 crée un hook d’action, add_action exécute des fonctions accrochées lorsque ce hook est appelé.

Par exemple, si vous ajoutez les éléments suivants dans le pied de page de votre thème:

do_action( 'my_footer_hook' );

Vous pouvez faire écho au contenu de cet emplacement depuis functions.php ou un plugin personnalisé:

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

Vous pouvez également passer des variables à un hook:

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

Que vous pouvez utiliser dans la fonction de rappel:

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

Dans votre cas, vous essayez probablement de filtrer la valeur en fonction d'une condition. C'est à quoi servent les crochets de filtre:

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

Référence

22
diggy

En fait, le add_action est un crochet d’action utilisé pour invoquer une action (un gestionnaire enregistré) à un moment donné en fonction de l’action, et le do_action est utilisé pour appeler manuellement cette action enregistrée. Par exemple:

add_action('some_hook', 'handler_for_some_hook');

Ce gestionnaire sera appelé lorsque vous exécuterez ou que le script effectuera le some_action, mais si vous le souhaitez, vous pouvez appeler cette action manuellement à l'aide du do_action. Donc, fondamentalement, le do_action appelle le hook d’action enregistré lorsque vous l’appelez. Vérifiez plus sur Codex .

2
The Alpha

// avec do_action nous créons notre propre balise (hook), utilisée dans wordpress Ex. Ici, j'ai ajouté 1 fonction personnalisée pour appeler ceciIn add_action, j'ai ajouté un nom de fonction avec n'importe quel nom de balise personnalisé With do_action (mon nom de balise personnalisé)

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

add_action('mytag','mywork');

do_action('mytag');

--- add_action () ---

crochet spécifique qui affectera par fonction ()

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

Cela changera la fonctionnalité et le comportement de wordpress en fonction du “crochet” spécifique, nous pourrons le changer ainsi que la méthode des fonctions.

0
Dhruv