- Home
- Categorie
- Coding e Sistemistica
- WordPress
- Inserire apply filters
-
Ok, ora ho capito, qui c'è la documentazione della funzione che devi usare per appendere la tua callback all'evento "pmpro_has_membership_access_filter" https://developer.wordpress.org/reference/functions/add_filter/
Prova così.
-
Grazie overclokk, ho estrapolato qualcosa, ma purtroppo mi da errore appena entro in un contenuto ristretto senza essere autorizzato.
[PHP]
/* funzione escludi */
function my_pmpro_has_membership_access_filter( $hasaccess, $mypost, $myuser, $post_membership_levels ) {$id_contenuti = array(35,36);
// Controllo l’accesso if( ! $hasaccess ) { // Se questo post è associato ad un livello di accesso o è bloccato if ( ! empty( $post_membership_levels ) && pmproap_isPostLocked( $mypost->ID ) ) { // imposta l’accesso libero if ( in_array($mypost->id, $id_contenuti)) { $hasaccess = true; } } } return $hasaccess;
}
add_filter( 'pmpro_has_membership_access_filter', 'my_pmpro_has_membership_access_filter', 20, 4 );
[/PHP]mi da un errore su questa linea di codice
if ( ! empty( $post_membership_levels ) && pmproap_isPostLocked( $mypost->ID ) ) {
-
Quella funzione è un po' confusionaria, troppe if indentate che rendono difficile la lettura, e poi senza errore non posso sapere il problema.
Prova a fare così, parti al contrario:
[PHP]
function my_pmpro_has_membership_access_filter( $hasaccess, $mypost, $myuser, $post_membership_levels ) {// imposta l’accesso libero if ( in_array($mypost->id, [35,36])) { $hasaccess = true; } return $hasaccess;
}
add_filter( 'pmpro_has_membership_access_filter', 'my_pmpro_has_membership_access_filter', 20, 4 );
[/PHP]Non è completa, poi la sistemiamo ma prima meglio partire semplici.
-
In questo modo funziona tutto, o meglio, tutte le aree con restrizioni vengono ristrette, compreso gli articoli con id 35 e 36.
-
Cioè il 35 e il 36 sono sempre privati e non pubblici??
-
Si, esattamente
-
[PHP]
function my_pmpro_has_membership_access_filter( $hasaccess, $mypost, $myuser, $post_membership_levels ) {var_dump($hasaccess); return $hasaccess;
}
add_filter( 'pmpro_has_membership_access_filter', 'my_pmpro_has_membership_access_filter', 20, 4 );
[/PHP]Dimmi che cosa ti ritorna il var_dump, dovresti vederlo sullo schermo.
-
bool(false)
-
Ok, ora dimmi cosa ritornano i var_dump qui sotto, ho anche messo momentaneamente return true per vedere se visualizzi tutti i post anche senza avere i permessi, poi lo rimettiamo a posto, meglio se provi proprio nelle pagine 35 e 36:
[PHP]
function my_pmpro_has_membership_access_filter( $hasaccess, $mypost, $myuser, $post_membership_levels ) {var_dump( $mypost->id ); var_dump( in_array( $mypost->id, [35,36] ) ); return true;
}
add_filter( 'pmpro_has_membership_access_filter', 'my_pmpro_has_membership_access_filter', 20, 4 );
[/PHP]
-
ID 35 mi esce
string(0) "" bool(false)
ID 36 mi esce
string(0) "" bool(false)
id di una pagina qualsiasi protetta
string(0) "" bool(false)Gli articoli si vedono tutti, anche per chi ha restrizioni.
-
35 e 36 sono quelli giusti?
Che cosa ti ritornava var_dump( $mypost->id ); ?
-
mi ritornano 0
string(0) ""
per avere una maggiore certezza ho sostituito l'id 36 con 11116 che sono sicuro che sia protetto
[PHP]function my_pmpro_has_membership_access_filter( $hasaccess, $mypost, $myuser, $post_membership_levels ) {
var_dump( $mypost->id ); var_dump( in_array( $mypost->id, [35,11116] ) ); return true;
}
add_filter( 'pmpro_has_membership_access_filter', 'my_pmpro_has_membership_access_filter', 20, 4 );[/PHP]ma il risultato è sempre quello, credo che non rilevi l'id del post a questo punto.
-
Vediamo se almeno $mypost esiste:
var_dump( $mypost );
-
Credo che tu abbia fatto bingo!!!
Questo è quello che appare all'inizio di tuttoobject(WP_Post)#30302 (24) { ["ID"]=> int(35) ["post_author"]=> string(1) "1" ["post_date"]=> string(19) "2014-03-24 00:28:00" ["post_date_gmt"]=> string(19) "2014-03-24 00:28:00" ["post_content"]=> string(10974) " segue il solo contentuo del post
Questo è quello che appare prima dell'articolo
"["post_title"]=> string(22) "La metrica di un brano" ["post_excerpt"]=> string(0) "" ["post_status"]=> string(7) "publish" ["comment_status"]=> string(4) "open" ["ping_status"]=> string(6) "closed" ["post_password"]=> string(0) "" ["post_name"]=> string(22) "la-metrica-di-un-brano" ["to_ping"]=> string(0) "" ["pinged"]=> string(0) "" ["post_modified"]=> string(19) "2020-05-10 13:33:19" ["post_modified_gmt"]=> string(19) "2020-05-10 11:33:19" ["post_content_filtered"]=> string(0) "" ["post_parent"]=> int(0) ["guid"]=> string(48) "https://www.dariopower.it/la-metrica-di-un-brano/" ["menu_order"]=> int(0) ["post_type"]=> string(4) "post" ["post_mime_type"]=> string(0) "" ["comment_count"]=> string(1) "4" ["filter"]=> string(3) "raw" } string(0) "" bool(false) int(35) ["post_author"]=> string(1) "1" ["post_date"]=> string(19) "2014-03-24 00:28:00" ["post_date_gmt"]=> string(19) "2014-03-24 00:28:00" ["post_content"]=> string(10974) " segue quindi il contenuto dell'articolo
-
Ho trovato il problema, colpa mia che non me ne sono accorto, l'ID è maiuscolo e non minuscolo, e son cose che dovrei sapere a memoria
Prova:
var_dump( $mypost->ID );E probabilmente ora dovrebbe funzionare:
[PHP]
function my_pmpro_has_membership_access_filter( $hasaccess, $mypost, $myuser, $post_membership_levels ) {// imposta l’accesso libero if ( in_array($mypost->ID, [35,36])) { $hasaccess = true; } return $hasaccess;
}
add_filter( 'pmpro_has_membership_access_filter', 'my_pmpro_has_membership_access_filter', 20, 4 );
[/PHP]
-
Funziona!!!!!
-
Ottimo
Ora come avevo detto in precedenza puliamo un po' questo snippet per renderlo più moderno e più robusto, funziona solo da PHP >= 7 (maggiore/uguale a).
[PHP]
/**-
@param bool $has_access
-
@param WP_Post $post
-
@return bool
*/
function allow_free_access_to_posts_for_pmpro( bool $has_access, \WP_Post $post bool {if ( in_array( $post->ID, [35,36] ) ) {
$has_access = true;
}return $has_access;
}
add_filter( 'pmpro_has_membership_access_filter', NAMESPACE . '\allow_free_access_to_posts_for_pmpro', 20, 2 );
[/PHP]Spiegone:
Ho rinominato la funzione dandole un nome che indicasse l'intento, questo aiuta se fra qualche tempo dobbiamo rimetterci mano e subito a prima occhiata sappiamo perché esiste senza bisogno di dover scrivere i commenti.
Ho inserito il type per i parametri.
Ho ridotto il numero dei parametri a 2 perché sono gli unici utilizzati, riducendo anche a 2 nel filtro.
Ho modificato il nome dei parametri per una lettura migliore.
Ho aggiunto il return type declaration bool perché la funzione ritorna sempre un booleano.
Ho aggiunto la costante NAMESPACE nel nome della callback un po' più complesso da spiegare https://www.php.net/manual/en/language.namespaces.php ma sempre meglio usarla.
Il commento sopra la funzione è opzionale.
Già così abbiamo migliorato la qualita del codice, se hai PHP 7 o superiore e la vuoi provare dimmi se ci sono errori perché io non avendo pmpro non ho potuto provarla.
PS: Non è ancora pulita al 100% perché l'array [35,36] con l'ID dei post ha ancora il problema che deve essere modificato a mano (hardcoding) tutte le volte che cambia qualcosa e questo non va bene, per ora funziona ma se diventa qualcosa che in futuro crea problemi bisogna trovare una soluzione differente (code smell).
-
-
Ho incollato il nuovo codice e va tutto bene,
la mia versione php è la 7.1.11
Ho capito bene tutte le modifiche tranne namespace che andrò a leggermi.
Per quanto riguarda l'array, non è tanto un problema, perchè credo che i post non saranno tantissimi e comunque un numero gestibile, piu che altro bisogna rimetterla nel file functions ogni volta che viene aggiornato il tema.
Grazie mille per la tua pazienza e per quello che fai per noi.
-
Ad ogni problema c'è una o più soluzioni, nel tuo caso le soluzioni sono 3, crei un child theme, crei un plugin o crei un MU plugin per inserire questo e futuri snippet, il beneficio primario è proprio per il fatto che non avrai problemi con gli aggiornamenti del tema, il secondo è che il tuo file functions.php rimarrà il più snello possibile che è cosa buona e giusta (un giorno ne parlerò su questo argomento sul mio canale yt), me per farla breve meno usi il file functions.php meglio è, in particolar modo quando devi aggiungere snippet che non hanno nulla a che fare con il tema, tu in questo caso vuoi modificare il comportamente di un plugin.
Il metodo che preferisco è quello di creare un plugin dedicato perché mi consente una migliore separazione delle funzionalità e manutenzione nel futuro, per esempio potresti sviluppare un plugin per aggiungere la possibilità di poter decidere da backend quali post permettere e quali no, ma questo richiede molto più tempo per essere sviluppato.
I plugin li puoi attivare e disattivare al bosogno, i mu-plugin rimangono sempre attivi, i primi vanno nella cartella plugins e i secondi nella cartella mu-plugins (che se non esiste devi crearla)
I plugin sono molto semplici da creare, basta un file con il nome che vuoi e l'intestazione da usare in questo file che trovi qui con tutta la documentazione https://developer.wordpress.org/plugins/plugin-basics/header-requirements/
-
Diciamo che il plugin è la scelta migliore, ho creato qualche plugin semplicissimo a livello di hello world, ma non saprei come farlo funzionare, o meglio se metto la funzione php nel file principale del plugin poi non saprei come attivarlo, gli altri plugin che ho fatto per mia comodità avevano tutti uno shortcode da mettere nel post.