Usare apply_filters con più argomenti e più add_filter

24 lug 2016, 17:36:22
Visualizzazioni: 15.2K
Voti: 1

Sto usando apply_filters per collegare diversi plugin ma ho difficoltà con gli argomenti. C'è un argomento, un array, e diverse implementazioni di add_filter che corrispondono ad apply_filters, ognuna delle quali riceve l'array originale e lo modifica.

Sembra che si possano passare più argomenti da apply_filter ma add_filter può restituire solo un argomento. È corretto o come si gestiscono più argomenti tra le chiamate add_filter?

Devo passare un secondo argomento che è un ID account, ma sembra che solo il primo add_filter riesca a lavorare con quell'argomento. Penso di incapsulare entrambi gli argomenti in un unico array, quindi un array con un array come primo valore e un ID utente come secondo argomento.

Esempio aggiunto

$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, 'Errore utente Plugin 1', true);
    return $error;
}

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

// $userid qui sotto è in realtà $error restituito da error_check_1 
function error_check_2($userid, $error){
    $error[] = get_user_meta($userid, 'Errore utente Plugin 2', true);
    return $error;
}

Il codice sopra non funziona come mi aspetto o come ho bisogno. I filtri sembrano concatenarsi, con l'argomento restituito dal primo che viene passato come argomento al successivo.

Voglio che entrambi ricevano la variabile $id e che la variabile $error venga incrementata come nell'esempio.

8
Commenti

Potresti pubblicare il tuo codice per chiarire un po' la tua domanda?

Andy Macaulay-Brook Andy Macaulay-Brook
24 lug 2016 17:38:17

Modificato per aggiungere un esempio.

Peter Bushnell Peter Bushnell
24 lug 2016 21:11:47

I filtri si concatenano davvero come hai detto tu. Sono progettati proprio per funzionare in questo modo.

Andy Macaulay-Brook Andy Macaulay-Brook
24 lug 2016 21:18:34

Il primo argomento deve essere il valore da filtrare: $error = apply_filters('check_for_more_errors', $error, $userid);, quindi correggi anche l'ordine dei parametri in error_check_*.

Ismail Ismail
24 lug 2016 23:33:32

Devi restituire la prima variabile, non la seconda.

fuxia fuxia
24 lug 2016 23:35:44

come dice @toscho... quindi scambiando i due argomenti ovunque dovrebbe risolvere il problema.

majick majick
25 lug 2016 08:28:28

Gli argomenti sono stati scambiati e ora il codice funziona. Il mio modello mentale è stato aggiornato e posso utilizzare un'altra eccellente funzionalità di WP. Sto riducendo l'accoppiamento tra i plugin su cui sto lavorando, interessante vedere le soluzioni che WP utilizza. Grazie a tutti per aver dedicato del tempo ad aiutare.

Peter Bushnell Peter Bushnell
25 lug 2016 09:25:17

@SamuelElh Potresti convertire il tuo commento in una risposta per sistemare? Grazie.

Andy Macaulay-Brook Andy Macaulay-Brook
25 lug 2016 16:21:56
Mostra i restanti 3 commenti
Tutte le risposte alla domanda 1
2

apply_filters richiede di passare il valore da filtrare nel secondo parametro di questa funzione (dopo il nome del tag dell'hook)

$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, 'Plugin 1 user error', 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, 'Plugin 2 user error', true);
    return $error;
}
25 lug 2016 16:40:44
Commenti

Penso che tu abbia scritto male il nome della prima funzione dato che è agganciata alla funzione error_check_1.

tpaksu tpaksu
20 set 2021 14:28:17

Grazie, ho corretto.

Ismail Ismail
21 set 2021 01:48:11