web-dev-qa-db-fra.com

Définir le thème actif via l'URL

J'ai un nouveau site WP avec quelques thèmes candidats et j'aimerais que l'utilisateur final puisse "parcourir" mes thèmes. Pour cela, je voudrais utiliser le Theme Switcher plugin de Ryan Boren, ou quelque chose de mieux si disponible, car quelque chose m'a amené à croire que cela me permettrait de spécifier un thème à activer via l'URL. Je ne trouve aucun document sur la façon de le configurer pour l'analyse des URL.

Tout ce que je peux trouver, c'est un widget de la barre latérale Sélecteur de thèmes, ce qui pose problème si l'utilisateur final (ou même moi) utilise ce widget pour basculer vers un thème sans barre latérale.

Je ne veux pas que cela soit une finalité non plus. Je souhaite présenter au client une liste d'URL, chacune pour le même site, mais avec un paramètre de thème différent.

PS: J'ai trouvé quelques solutions qui sélectionnent un modèle pour un message via l'URL du message, mais je ne suis pas certain qu'un modèle de type message serait identique à un thème complet, installé.

2
ProfK

J'ai créé un cours simple qui fera exactement ce que tu veux. Pour changer de thème, vous devez ajouter le paramètre theme GET à l'URL de votre site avec le nom du thème. http://example.com/?theme=twentyfifteen

Le thème sélectionné sera également stocké dans un cookie. Ainsi, lors de la prochaine utilisation du site, l'utilisateur aura déjà sélectionné le thème.

class WPSE_287356_Theme_Switcher {

    /**
     * Theme which we want to activate
     */
    private $theme;

    /**
     * Cookie name
     */
    private $cookie;

    /**
     * GET parameter name
     */
    private $get;

    /**
     * Switched
     */
    private $switched;

    /**
     * Class constructor
     */
    public function __construct() {

        /**
         * Get default theme
         */
        $this->theme = get_option('template');

        /**
         * Define cookie name
         */
        $this->cookie = 'theme';

        /**
         * Define get parameter name
         */
        $this->get = 'theme';

        /**
         * Define if theme is already switched
         */
        $this->switched = false;

        $this->handle_url();
        $this->switch_theme();

        /**
         * Define plugin related hooks
         */
        $this->define_hooks();
    }

    /**
     * Get theme
     */
    public function get_theme() {

        return $this->theme;
    }

    /**
     * Handle for theme change
     *
     * When the user clicks special link with theme name we will
     * store this theme name in user cookies and 
     */
    public function handle_url() {

        if( isset( $_GET[$this->get] ) && !empty( $_GET[$this->get] ) ) {

            $theme = filter_input(INPUT_GET, $this->get, FILTER_SANITIZE_STRING );

            // This part require some additional checking e.g if theme exits or is allowed.

            $this->theme = $theme;
            $this->switched = true;

            // Store theme in cookie to remember choice
            setcookie( $this->cookie, $theme, time() + ( 365 * DAY_IN_SECONDS ), COOKIEPATH, COOKIE_DOMAIN );
        }
    }

    /**
     * Switch theme
     *
     * Check if user has cookie with theme name and eventualy switch theme
     */
    public function switch_theme() {

        if( isset( $_COOKIE[ $this->cookie ] ) && !$this->switched ) {

            $theme = filter_input( INPUT_COOKIE, $this->cookie, FILTER_SANITIZE_STRING );

            // This part require some additional checking e.g if theme exits or is allowed.

            $this->theme = $theme;
        }
    }

    /**
     * Define plugin related hooks
     */
    private function define_hooks() {

        /**
         * This filters will replace theme name across all WordPress
         */
        add_filter( 'template', array( $this, 'get_theme' ) );
        add_filter( 'stylesheet', array( $this, 'get_theme' ) );
    }
}

new WPSE_287356_Theme_Switcher();
5
kierzniak