web-dev-qa-db-de.com

Einen benutzerdefinierten Beitragstyp nur für Nichtbenutzer über einen bestimmten Link sichtbar machen

Ich arbeite daran, eine kleine Web-App mit WordPress als Framework zu erstellen. Sie können einen Kunden eingeben und dem Kunden eine E-Mail mit einem Link zurück zur Website senden, um eine kurze Umfrage auszufüllen.

Ich habe einen benutzerdefinierten Beitragstyp "Kunde", der die Umfragefragen als benutzerdefinierte Felder enthält. Ich sperre den Inhalt und die Admin-Bereiche usw. mit s2member, was bisher großartig funktioniert hat.
Ich bin jedoch nach einer Möglichkeit, auf der ich eine separate Seite anzeigen kann, auf der sich das Umfrageformular befindet und die nur für diejenigen angezeigt wird, die den Link in einer E-Mail erhalten. Möglicherweise etwas mit Keksen und htaccess?

Ich habe in den letzten Stunden versucht, eine Antwort zu finden, aber es geht mir ein bisschen über den Kopf. Jede Hilfe, auch wenn nur ein Push in die richtige Richtung wäre sehr dankbar!

2
Wattsy

Ich denke, was Sie wollen, ist eine benutzerdefinierte Umschreiberegel - speziell ein benutzerdefinierter Endpunkt.

Dies müsste außerhalb von s2member leben.

Um zu beginnen, packe alles in eine Klasse:

<?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.
    }
}

Dort gibt es einige Konstanten, die wir später verwenden werden.

Sie müssen Ihre Beitragstypregistrierung ändern, um eine benutzerdefinierte Endpunktmaske in das Argument rewrite aufzunehmen.

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

Von dort aus können wir uns in init einhängen und add_rewrite_endpoint aufrufen.

Dadurch wird ein Umschreiben eingerichtet, sodass wir zu yoursite.com/customers/the-post/key/some_key_here wechseln können.

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

Jetzt müssen Sie sich nur noch in template_redirect einhängen und den Schlüssel validieren.

<?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
    }
}

Es kann auch hilfreich sein, eine Nice-API für die Verwendung zu erstellen (das obige Codebit verwendet eine dieser Methoden).

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

Jetzt können Sie das oben genannte verwenden wie ...

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

Ich bin mir nicht sicher, wie gut das mit s2member zusammenspielt, aber im Grunde blockiert dies jeden Zugriff auf die Seiten ohne Schlüssel am Frontend. Möglicherweise müssen Sie den Zugriff mit s2member überhaupt nicht einschränken. Hier ist alles das als Plugin .

1
chrisguitarguy

Beiträge können kennwortgeschützte Beiträge in der Spalte post_password in der Tabelle wp_posts enthalten. Oder Sie können http://wordpress.org/extend/plugins/post-password-plugin/ verwenden, um eindeutige Token zu generieren.

0
totels

Meine (einfache) Lösung wäre alles, was Sie brauchen

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

und alles in dieser if wird nur für diejenigen angezeigt, die nicht angemeldet sind.

0
MadCom