私はフレームワークとしてワードプレスで小さなWebアプリを作成することに取り組んでいます。それはあなたが顧客を入力することを可能にし、そして順番に短い調査を完成するためにウェブサイトに戻ってリンクで顧客に電子メールを送ります。
カスタムフィールドとしてアンケートの質問を含む "顧客"カスタム投稿タイプがあります。私はこれまでのところうまく機能しているs2memberでコンテンツや管理領域などをロックしています。
しかし、私は調査票を載せた別のページを表示し、リンクを受け取った人のためにそれを電子メールで表示することができるようにする方法を取っています。おそらくクッキーとhtaccessを使って何か?
私は過去数時間の答えを見つけようとしましたが、それは私の頭の上に少しです。正しい方向へのプッシュだけでも、どんな助けでも大歓迎です!
私はあなたが欲しいのはカスタム書き換え規則 - 具体的には、カスタムエンドポイントだと思います。
これは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を使ってアクセスを制限する必要はまったくないかもしれません。これがプラグインとしての です。
投稿は、wp_postsテーブルのパスワード保護された投稿post_password
列を持つことができます。あるいは、 http://wordpress.org/extend/plugins/post-password-plugin/ を使用して固有のトークンを生成することもできます。
私の(単純な)解決策はあなたが必要とするすべてを入れるでしょう
if ( ! is_user_logged_in() ){
//stuff
}
そしてこのif
の中のすべてはログインしていない人のためにだけ表示されます。