Încercarea de a utiliza add_action și do_action cu parametri
Î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);
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țiaalter_item
la cârligul de acțiuneadmin_menu
. Astfel, când acțiuneaadmin_menu
are loc, funcțiaalter_item
este executată. Conform codex-ului, nicio parametru nu este transmis funcțiilor atașate laadmin_menu
. Deci, parametrii pe care încerci să îi folosești înalter_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țiunealter_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 cudo_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;
}
} );

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

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ș :)

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