web-dev-qa-db-ja.com

重力フォームを送信してコンテンツを制限する

私はこれに対する解決策を見つけるのに苦労しています:

私は内容を制限した投稿をたくさん持っています、そしてこれらのページの内容にアクセスするためにユーザーは重力フォームを提出しなければなりません。私がそうする最もよい方法がgform_after_submissionが起こるときクッキーを設定することであると思います。それから機能はそのクッキーをチェックし、結果に応じてこれまたはそれを表示します。つまり、サイト全体に1つのCookieを使用するのではなく、すべての投稿にCookieが必要です。これは私が今持っているものです:

提出後にクッキーを作成する。 ここでの私の考えは、クッキーに名前を付けてそれをユニークにするためにポストIDを使うことでした。この後、私はここからどこにもなっていません。

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);
}

そのクッキーが存在するかどうかを確認します。 それで投稿後、ページはリロードされ、設定されているクッキーはブラウザによって検出され、事態が起こります。

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

問題は、特定のページで作成されたこの特定のcookieは、Origin投稿でしか検出できないため、コンテンツを別の投稿に移動した場合でも、コンテンツが解放されるのを制限して独自の投稿を待つことです。

そう、何かアイデアはありますか?

4
Paulo Gabriel

あなたのフォームに隠しフィールドを最初に作成することによってあなたがしていることを達成することができます。現在の埋め込みページに値を設定します。

enter image description here 

このデモでは、隠しフィールドIDに注意してください。これは3です。


それからコンテンツのためのあなたのコードはあなたが持っていたものに似ています:

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;
    }
});

処理のために、私たちはやる

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

the_contentフィルターの中で、全部ではなく一部のページにこれを表示させたい場合は、必要ではないページIDに条件を追加することができます。そして、post_meta/metaboxのチェックボックスを使って探索することができます。

上記のようにページごとにクッキーを1つずつ保存することも、メインのクッキーを1つ作成することもできます。この場合、値は追加して探すIDのシリアル化された配列です。

クッキーを使用することは絶対に安全ではありません、彼らは偽造することができます。したがって、繊細な情報を隠している場合は、認証、安全なCookieの保存、およびCookie /ユーザーの確認を確認する必要があります。これが私が想定しているものであるとすれば、これは良いアプローチです。

私はアクションで匿名関数を使用しました。もしこれがパブリックプラグイン/テーマであれば、代わりに関数を呼び出したいと思うかもしれません。

2
David Sword

コードに触れないようにしたいのであれば、Davidの解決策はこれを代替手段としてここに含めるだけで問題ありません。

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

0
David