web-dev-qa-db-ja.com

カスタム投稿タイプを特定のリンクを介して非ユーザーにのみ表示可能にする

私はフレームワークとしてワードプレスで小さなWebアプリを作成することに取り組んでいます。それはあなたが顧客を入力することを可能にし、そして順番に短い調査を完成するためにウェブサイトに戻ってリンクで顧客に電子メールを送ります。

カスタムフィールドとしてアンケートの質問を含む "顧客"カスタム投稿タイプがあります。私はこれまでのところうまく機能しているs2memberでコンテンツや管理領域などをロックしています。
しかし、私は調査票を載せた別のページを表示し、リンクを受け取った人のためにそれを電子メールで表示することができるようにする方法を取っています。おそらくクッキーとhtaccessを使って何か?

私は過去数時間の答えを見つけようとしましたが、それは私の頭の上に少しです。正しい方向へのプッシュだけでも、どんな助けでも大歓迎です!

2
Wattsy

私はあなたが欲しいのはカスタム書き換え規則 - 具体的には、カスタムエンドポイントだと思います。

これはs2memberの外に住んでいなければならないでしょう。

はじめに、すべてをクラスにラップします。

<?php
class WPSE71804
{
    // post type key, whatever this happens to be.
    const TYPE = 'customer';

    // endpoint mask, 2 ^ 18
    const EP = 262144;

    // key prefix, used for options
    const PREFIX = 'wpse71804_key_';

    // container for the instance of this class
    private static $ins = null;

    public static function instance()
    {
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }

    public static function init()
    {
        add_action('plugins_loaded', array(self::instance(), '_setup'));
    }

    // add actions and such.
    public function _setup()
    {
       // we'll add actions here later.
    }
}

後で使用する定数がいくつかあります。

rewrite引数にカスタムエンドポイントマスクを含めるように投稿タイプの登録を変更する必要があります。

<?php
class WPSE71804
{
    // snip snip

    // add actions and such.
    public function _setup()
    {
        add_action('init', array($this, 'register'));
    }

    // register the post type
    public function register()
    {
        // rewrite is the args to pay attention to we need 
        // to set a custom endpoint mask
        register_post_type(self::TYPE, array(
            'label'     => __('Customers', 'wpse'),
            'public'    => true,
            'rewrite'   => array(
                'slug'          => 'customer',
                'ep_mask'       => self::EP,
                'with_front'    => false,
            ),
        ));
    }
}

そこから、initにフックして add_rewrite_endpoint を呼び出すことができます。

これで書き換えが設定され、yoursite.com/customers/the-post/key/some_key_hereに移動できます。

<?php
class WPSE71804
{
    // snip snip

    // add actions and such.
    public function _setup()
    {
        add_action('init', array($this, 'register'));
        add_action('init', array($this, 'endpoint'), 11);
    }

    // snip snip

    public function endpoint()
    {
        add_rewrite_endpoint('key', self::EP);
    }
}

これはtemplate_redirectにフックしてキーを検証するだけの問題です。

<?php
class WPSE71804
{
    // snip snip

    public static function init()
    {
        add_action('plugins_loaded', array(self::instance(), '_setup'));
        register_activation_hook(__FILE__, array(__CLASS__, 'activate'));
    }

    // add actions and such.
    public function _setup()
    {
        add_action('init', array($this, 'register'));
        add_action('init', array($this, 'endpoint'), 11);
        add_action('template_redirect', array($this, 'validate_key'));
    }

    // snip snip

    public function validate_key()
    {
        // not a a singular customer page? Or have an admin user? bail.
        if(!is_singular(self::TYPE) || current_user_can('manage_options'))
            return;

        if(!($_key = get_query_var('key')) || !($key = self::get_key($_key)))
        {
            global $wp_query;
            $wp_query->set_404();
        }

        // if we're here, the key is okay, let the request go through
    }
}

また、使用するNice APIを作成すると便利かもしれません(上記のコードでは、これらのメソッドの1つを使用しています)。

<?php
class WPSE71804
{
    // snip snip

    /********** API **********/

    // create a new key
    public static function create_key()
    {
        $k = wp_generate_password(24, false);
        self::update_key($k, 'notdone');
        return $k;
    }

    // update a key
    public static function update_key($key, $val='done')
    {
        return update_option(self::PREFIX . $key, $val);
    }

    // delete a key
    public static function delete_key($key)
    {
        return delete_option(self::PREFIX . $key);
    }

    public static function get_key($key)
    {
        return get_option(self::PREFIX . $key);
    }
}

今、あなたは上のようなものを使うことができます...

<?php
// create a key
$k = WPSE71804::create_key();

// send mail with key here!

// after they submit the survey, you might want to make a note of that.
WPSE71804::update_key($k, 'done');

// or maybe just delete it and revoke access to the page
WPSE71804::delete_key($k);

それがs2memberとどの程度うまくいっているかはわかりませんが、本質的にこれはフロントエンドにキーがないとページへのすべてのアクセスをブロックします。 s2memberを使ってアクセスを制限する必要はまったくないかもしれません。これがプラグインとしての です。

1
chrisguitarguy

投稿は、wp_postsテーブルのパスワード保護された投稿post_password列を持つことができます。あるいは、 http://wordpress.org/extend/plugins/post-password-plugin/ を使用して固有のトークンを生成することもできます。

0
totels

私の(単純な)解決策はあなたが必要とするすべてを入れるでしょう

if ( ! is_user_logged_in() ){    
//stuff    
}

そしてこのifの中のすべてはログインしていない人のためにだけ表示されます。

0
MadCom