web-dev-qa-db-fra.com

Limitez le contenu en soumettant des formulaires Gravity

J'ai du mal à trouver une solution à cela:

J'ai un tas de messages avec un contenu restreint, et pour accéder au contenu de ces pages, l'utilisateur doit soumettre un formulaire de gravité. J'imagine que la meilleure façon de le faire est de définir un cookie lorsque gform_after_submission a lieu. Ensuite, une fonction vérifie ce cookie et affiche ceci ou cela en fonction du résultat. Le problème est le suivant: j'ai besoin d'un cookie pour chaque message plutôt que d'un cookie pour l'ensemble du site. Voici ce que j'ai maintenant:

Créer un cookie après la soumission. Mon idée ici était d'utiliser l'identifiant de la publication pour nommer le cookie et le rendre unique. Après cela, mais je ne vais nulle part d'ici.

add_action( 'gform_after_submission_1', 'create_cookie' );
function create_cookie() {
    setcookie( 'cookie'.get_the_ID(), 1, strtotime( '+30 days' ), COOKIEPATH, COOKIE_DOMAIN, false, false);
}

Vérifier si ce cookie existe. Ainsi, après la soumission, la page sera rechargée et le cookie défini sera détecté par le navigateur et tout se passera.

add_filter( 'the_content', 'checkingCookie' );
function checkingCookie($content) {
  if( !isset( $_COOKIE['cookie'.get_the_ID()] ) ) {
     return 'no cookies!';
  }
  else {
     return 'cookies!';
  }
}

Le fait est que ce cookie créé dans une page donnée ne devrait être détectable que dans son article d’origine, de sorte que, si je passe à un autre article, le contenu reste restreint et attend sa propre soumission pour libérer le contenu.

oui, des idées?

4
Paulo Gabriel

Vous pouvez accomplir ce que vous recherchez en créant d'abord un champ caché dans votre formulaire. Définissez la valeur sur la page d'intégration en cours:

 enter image description here 

Prenez note de l'ID des champs cachés, pour cette démonstration, il s'agit de 3.


Ensuite, votre code pour le contenu est similaire à ce que vous aviez:

add_action( 'the_content', function ($content) {

    // check if user has submitted this pages form, if not, show only form
    if( !isset( $_COOKIE['unrestrict_'.get_the_ID()] ) ) {

        // get form #1
        $form = RGForms::get_form(1);

        // uncomment to review cookies
        // echo "<pre>".print_r($_COOKIE,true)."</pre>";

        return '<h2>Restricted Content - Fill out Form</h2>'.$form;
    } else {

        // user has in last 30 days submitted this pages form
        // show content
        return $content;
    }
});

Pour le traitement, nous ferons

add_action( 'gform_after_submission_1', function ($entry, $form) {

    // uncomment to review the entry
    // echo "<pre>".print_r($entry,true)."</pre>"; die;

    // get the hidden field, the embedded from page
    $from_page = rgar( $entry, '3' );

    // set the cookie
    setcookie( 'unrestrict_'.$from_page, 1, strtotime( '+30 days' ), COOKIEPATH, COOKIE_DOMAIN, false, false);

    // redirect so we dont land on gravity forms "thank you" page
    wp_redirect( get_permalink( $from_page ) );

}, 10, 2);

Si vous souhaitez que cela apparaisse sur certaines pages, mais pas toutes, à l'intérieur du filtre the_content, vous pouvez ajouter vos conditions de base pour l'identifiant de page que vous ne voulez pas. Et vous pouvez explorer une case à cocher avec post_meta/metabox.

Vous pouvez choisir de stocker un cookie par page, comme ci-dessus, ou de créer un cookie principal dont la valeur correspond à un tableau sérialisé d'identifiants que vous ajoutez et recherchez.

autant que je sache, les cookies ne sont pas sécurisés, ils peuvent être falsifiés. Donc, si vous cachez des informations délicates, vous devez vérifier l’authentification, le stockage sécurisé des cookies et la vérification des cookies/utilisateur. Si c'est ce que je présume, c'est pour capter le plomb, c'est une bonne approche.

J'ai utilisé des fonctions anonymes dans les actions. S'il s'agit d'un plugin/thème public, vous pouvez appeler la fonction à la place.

2
David Sword

La solution de David est tout à fait correcte, il suffit simplement d'inclure ceci ici comme alternative si vous voulez éviter de toucher au code:

https://gravitywiz.com/submit-gravity-form-access-content/

0
David