Încercarea de a utiliza add_action și do_action cu parametri

15 ian. 2015, 12:05:27
Vizualizări: 28.4K
Voturi: 9

În fișierul functions.php al temei mele, încerc să adaug o funcție cu parametri (ca test pentru a verifica dacă funcționează, nu pentru funcționalitate) și pur și simplu nu merge.

Parametrii ajung întotdeauna goi chiar dacă apelez do_action cu parametrii transmiși așa cum este sugerat în această pagină din codex.

function alter_item ($user, $items, $action) {
    global $current_user, $menu;
    get_currentuserinfo();

    switch ($action) {
        case false:
            if ($current_user->user_login == $user) {
                remove_menu_page ($items);
            }
        break;

        case true:
            if ($current_user->user_login == $user) {
                remove_menu_page ($items);
            }
        break;
    }
}

add_action( 'admin_menu', 'alter_item', 10, 3 );
do_action('alter_item', 'my-user', 'plugins.php', false);
0
Toate răspunsurile la întrebare 1
3
13

O folosești greșit.

  • add_action: atașează o funcție la un cârlig de acțiune. În codul tău, atașezi funcția alter_item la cârligul de acțiune admin_menu. Astfel, când acțiunea admin_menu are loc, funcția alter_item este executată. Conform codex-ului, nicio parametru nu este transmis funcțiilor atașate la admin_menu. Deci, parametrii pe care încerci să îi folosești în alter_item nu sunt valizi.

  • do_action: invocă toate funcțiile atașate unui cârlig de acțiune. În codul tău, invoci toate funcțiile atașate cârligului de acțiune alter_item. alter_item ar fi un cârlig de acțiune personalizat, deoarece nu face parte din nucleul WordPress, dar momentan în codul tău nu există nicio funcție atașată la această acțiune, așa că nimic nu se va întâmpla cu do_action('alter_item'....

Modul corect de a atașa o funcție la admin_menu este:

function alter_item() {
    //Fă ce dorești aici
}
//Argumentul de prioritate (10 în codul de mai jos) este opțional.
add_action( 'admin_menu', 'alter_item', 10 );

Modul corect de a defini acțiuni personalizate:

do_action('alter_item', 'my-user', 'plugins.php', false);

Apoi poți atașa funcții la acțiunea alter_item astfel:

add_action( 'alter_item', 'alter_item_attached_function', 10, 3 );

function alter_item_attached_function( $user, $items, $action ) {
     //Acum $user, $items și $action vor fi 'my-user', 'plugins.php' și false
}

Dacă vrei să transmiți informații la acțiunile din nucleu, poți:

  • folosi parametrii valizi pentru fiecare acțiune. Consultă documentația oficială pentru fiecare acțiune.
  • defini variabile globale, folosi opțiuni, transient sau proprietăți/metode ale obiectelor personalizate, astfel încât să poți folosi acele informații în diferite părți ale codului tău. Exemplu.
  • Folosi funcții anonime PHP cu cuvântul cheie use.

Exemplu folosind cuvântul cheie use:

$user = 'my-user';
$items = 'plugins.php';
$action = false;

add_action( 'admin_menu', function() use ($user, $items, $action) {
    global $current_user, $menu;
    get_currentuserinfo();
    switch ($action) {
        case false:
            if ($current_user->user_login == $user) {
                remove_menu_page ($items);
            }
        break;

        case true:
            if ($current_user->user_login == $user) {
                remove_menu_page ($items);
            }
        break;
    }
} );
15 ian. 2015 13:29:16
Comentarii

UAU, este mult mai complicat decât mi-am imaginat, dar are 100% sens, mulțumesc cybmeta!

wxT3APyGfkYJVK wxT3APyGfkYJVK
15 ian. 2015 13:48:00

Am dat vot negativ, deoarece apelurile de funcții anonime prin action_hooks nu pot fi dezactivate. Aceasta este o practică foarte proastă, deoarece înseamnă că alții nu pot elimina/înlocui apelul. Action hooks ar trebui să fie făcute ÎNTOTDEAUNA corect.

exemplu:

add_action('some_action_hook', 'some_function'); // Acesta este bun și poate fi eliminat prin remove_action().

add_action('admin_menu', function() { // cod }); // acesta este rău, deoarece acum nu există nicio modalitate de a utiliza remove_action pentru a elimina acest comportament.

Serios, această metodă este doar leneșă și neglijentă și nu există niciun motiv real valid pentru a fi nevoie să o folosești, în afară de a fi leneș :)

Hybrid Web Dev Hybrid Web Dev
12 dec. 2015 00:57:45

Nu sunt de acord cu tine. Pot exista situații în care utilizarea funcțiilor anonime conectate la acțiuni și filtre poate fi pe deplin justificată. De asemenea, trebuie să știi că funcțiile anonime pot fi dezactivate (într-un mod foarte murdar, recunosc). Oricum, acesta a fost doar un exemplu din multele posibilități despre care am vorbit (variabile globale, opțiuni, transienti, proprietăți ale obiectelor, .....). Citește din nou răspunsul cu mai multă atenție, nu fi leneș la citit ;)

cybmeta cybmeta
12 dec. 2015 08:43:54