- Home
- Categorie
- Coding e Sistemistica
- WordPress
- Inserire apply filters
-
Praticamente ho un area ristretta del mio sito accessibile solo se iscrivi al leve_1 , tutti gli utenti occasionali di passaggio e non registrati non possono vedere queste aree ristrette.
La ristrezione va per categoria, quindi tutti i post di quella categoria sono ristretti.
Volevo escludere un post da quella categoria e renderlo accessibile a tutti, ho trovato quindi un documento sul sito dello sviluppatore in cui dice che inserendo quel filtro e mettendo le variabili relative ai post ai livelli o agli utenti, i posto vengono resi pubblici a tutti.
Ho inserito il filtro come mi hai corretto tu, ma pur visitando quell'articolo, ancora appare ristretto.
-
Metti qui il link senza www e senza http che guardo la documentazione.
-
-
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).
-