• User Attivo

    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.


  • Moderatore

    35 e 36 sono quelli giusti?

    Che cosa ti ritornava var_dump( $mypost->id ); ?


  • User Attivo

    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.


  • Moderatore

    Vediamo se almeno $mypost esiste:

    var_dump( $mypost );


  • User Attivo

    Credo che tu abbia fatto bingo!!! :figo2:
    Questo è quello che appare all'inizio di tutto

    
    object(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
    

  • Moderatore

    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 :fumato:

    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]


  • User Attivo

    Funziona!!!!!


  • Moderatore

    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).


  • User Attivo

    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.


  • Moderatore

    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/


  • User Attivo

    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.


  • Moderatore

    I plugin si creano tutti nello stesso modo, puoi prendere esempio da quelli che hai già creato, vedi il link alla documentazione sopra.


  • User Attivo

    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.


  • Moderatore

    Comportamento molto strano, non dovrebbe succedere, ma in locale o in remoto?


  • User Attivo

    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 .


  • Moderatore

    L'ultimo snippet funziona solo con la versione 7 di PHP.

    I file caricali sempre via ftp.


  • User Attivo

    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 !!!


  • Moderatore

    Ottimo 🙂


  • User Attivo

    Grazie ancora ❤