apply_filters cu argumente multiple și multiple add_filter

24 iul. 2016, 17:36:22
Vizualizări: 15.2K
Voturi: 1

Folosesc apply_filters pentru a face legătura între plugin-uri, dar am probleme cu argumentele. Există un singur argument, un array, și mai multe implementări de add_filter care corespund cu apply_filters, fiecare dintre ele pasând array-ul original și adăugând la el.

Se pare că poți pasa mai multe argumente din apply_filter, dar add_filter poate returna doar un singur argument. Este corect sau cum se gestionează argumente multiple între apelurile add_filter?

Trebuie să pas un al doilea argument care este un ID de cont, dar se pare că doar primul add_filter poate lucra cu acel argument. Planific să încapsulez ambele argumente într-un singur array și să-l pas astfel - un array cu un array ca primă valoare și un ID de utilizator ca al doilea argument.

Editat pentru a adăuga exemplu

$error = apply_filters('check_for_more_errors', $userid, $error);

add_filter('check_for_more_errors', 'error_check_1', 1, 2);

function error_check($userid, $error){
    $error[] = get_user_meta($userid, 'Eroare utilizator Plugin 1', true);
    return $error;
}

add_filter('check_for_more_errors', 'error_check_2', 2, 2);

// $userid mai jos este de fapt $error returnat din error_check_1 
function error_check_2($userid, $error){
    $error[] = get_user_meta($userid, 'Eroare utilizator Plugin 2', true);
    return $error;
}

Exemplul de mai sus nu funcționează cum mă așteptam sau am nevoie. Se pare că filtrele sunt legate în lanț, cu argumentul returnat de primul fiind pasat ca argument următorului.

Vreau ca ambele să primească variabila $id și ca variabila $error să fie augmentată ca în exemplu.

8
Comentarii

Poți să postezi codul tău pentru a clarifica puțin întrebarea ta?

Andy Macaulay-Brook Andy Macaulay-Brook
24 iul. 2016 17:38:17

Editat pentru a adăuga un exemplu.

Peter Bushnell Peter Bushnell
24 iul. 2016 21:11:47

Filtrele se pot lega în lanț, cum ai menționat. Acesta este modul în care sunt proiectate.

Andy Macaulay-Brook Andy Macaulay-Brook
24 iul. 2016 21:18:34

Primul argument trebuie să fie valoarea care va fi filtrată: $error = apply_filters('check_for_more_errors', $error, $userid);, deci corectează și ordinea parametrilor în error_check_*.

Ismail Ismail
24 iul. 2016 23:33:32

Trebuie să returnezi prima variabilă, nu a doua.

fuxia fuxia
24 iul. 2016 23:35:44

cum spune @toscho... deci inversarea celor două argumente peste tot ar trebui să rezolve problema.

majick majick
25 iul. 2016 08:28:28

Argumentele au fost schimbate și codul funcționează acum. Modelul meu mental a fost actualizat și pot folosi încă o caracteristică excelentă a WP. Reduc cuplarea între plugin-urile la care lucrez, interesant de văzut soluțiile pe care le folosește WP. Mulțumesc tuturor pentru timpul acordat pentru a ajuta.

Peter Bushnell Peter Bushnell
25 iul. 2016 09:25:17

@SamuelElh Poți să transformi comentariul tău într-un răspuns pentru a ordona? Mersi.

Andy Macaulay-Brook Andy Macaulay-Brook
25 iul. 2016 16:21:56
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 1
2

apply_filters necesită să transmiți valoarea care trebuie filtrată în al doilea parametru al acestei funcții (după numele etichetei hook-ului)

$error = apply_filters('check_for_more_errors', $error, $userid);

add_filter('check_for_more_errors', 'error_check_1', 1, 2);

function error_check_1($error, $userid){
    $error[] = get_user_meta($userid, 'Eroare utilizator Plugin 1', true);
    return $error;
}

add_filter('check_for_more_errors', 'error_check_2', 2, 2);

function error_check_2($error, $userid){
    $error[] = get_user_meta($userid, 'Eroare utilizator Plugin 2', true);
    return $error;
}
25 iul. 2016 16:40:44
Comentarii

Cred că ai greșit scrierea primului nume de funcție, deoarece este conectată la funcția error_check_1.

tpaksu tpaksu
20 sept. 2021 14:28:17

Mulțumesc, am corectat.

Ismail Ismail
21 sept. 2021 01:48:11