- Home
- Categorie
- Coding e Sistemistica
- WordPress
- Inserire apply filters
-
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.
-
I plugin si creano tutti nello stesso modo, puoi prendere esempio da quelli che hai già creato, vedi il link alla documentazione sopra.
-
Ho creato un mu-plugin che è un metodo spettacolare! Mi hai aperto un mondo nuovo!
Ma dopo aver creato il file php con il codice funziona tutto, ma il tempo di pochi minuti e il sistema mi elimina il plugin.
Davvero strano.
-
Comportamento molto strano, non dovrebbe succedere, ma in locale o in remoto?
-
In remoto, sia sul file manager del mio hosting, che su quello di wordpress che con un client ftp.
Sul client mi dava errore sulla riga "function" ma credo forse sia impostato ancora sul vecchio php 3 o 5 .
-
L'ultimo snippet funziona solo con la versione 7 di PHP.
I file caricali sempre via ftp.
-
Dopo aver fatto parecchie prove ho trovato il guaio, questi due parametri provocano un errore, eppure sono dei banali commenti
Text Domain: nn Domain Path: /languages
Adesso funziona tutto, grazie mille per il tuo aiuto e per la tua pazienza !!!
-
Ottimo
-
Grazie ancora