• Moderatore

    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.


  • User Attivo

    In questo modo funziona tutto, o meglio, tutte le aree con restrizioni vengono ristrette, compreso gli articoli con id 35 e 36.


  • Moderatore

    Cioè il 35 e il 36 sono sempre privati e non pubblici??


  • User Attivo

    Si, esattamente


  • Moderatore

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


  • User Attivo

    bool(false)


  • Moderatore

    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]


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