Establecer tema activo a través de URL

2

Tengo un nuevo sitio WP con un par de temas candidatos y me gustaría que el usuario final pueda "navegar" por mis temas. Para eso, me gustaría usar el plugin Theme Switcher por Ryan Boren, o algo mejor si está disponible, porque algo lo llevó Creo que me permitiría especificar un tema a activar a través de la URL. Aunque no puedo encontrar ningún documento sobre cómo configurarlo para el análisis de URL.

Todo lo que puedo encontrar es un widget de barra lateral de Theme Switcher, que causa problemas si el usuario final (o incluso yo) usa ese widget para cambiar a un tema sin barra lateral.

Tampoco quiero que sea una característica final. Quiero presentar al cliente una lista de URL, cada una para el mismo sitio pero con un parámetro de tema diferente.

PS: he encontrado algunas soluciones que seleccionan una plantilla para una publicación a través de la URL de la publicación, pero no estoy seguro de que una plantilla de tipo de publicación sea igual a una completa, instalado, tema.

    
pregunta ProfK 30.11.2017 - 04:13

1 respuesta

5

Creé una clase simple que hará exactamente lo que quieres. Para cambiar de tema, debe agregar el parámetro GET del tema a la URL de su sitio con el nombre del tema. enlace

El tema seleccionado también se almacenará en una cookie, por lo que la próxima vez que el usuario ingrese al sitio, tendrá un tema seleccionado anteriormente.

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();
    
respondido por el kierzniak 02.12.2017 - 19:06

Lea otras preguntas en las etiquetas