web-dev-qa-db-fra.com

En utilisant PHP faire basculer l'image de la feuille de style et de l'en-tête

Je n'avais pas beaucoup travaillé avec les cookies ou Wordpress auparavant, alors je pense avoir été un peu trop optimiste dans ma quête: p J'ai créé deux thèmes pour mon site, nuit et jour. Je voudrais que l'utilisateur puisse choisir le thème qu'il souhaite parmi un widget texte activé dans la barre latérale, qui définira ensuite un cookie avec son choix, puis changera pour la feuille de style appropriée (style.css pour la nuit, default et style1.css pour le jour), puis chargez une nouvelle image d'en-tête.

J'ai la fonctionnalité -sort de- en place ici, http://somethingoriginal.net , mais le cookie ne semble pas être en train de s'installer immédiatement dans Chrome. Comme je l'ai dit, les instructions d'écho que j'ai utilisées pour imprimer les variables à tester ne semblent pas cohérentes, cela prend quelques clics, puis change, mais l'image d'en-tête ne bouge pas du tout. Dans Firefox, il est parfois ajouté une barre oblique inversée à la fin de mon URL et cela renvoie l'utilisateur à une page "introuvable". Je n'ai aucune idée de ce que ça fait dans IE.

Je me demande simplement ce que je dois faire pour améliorer les fonctionnalités? Je n'ai pas besoin de ça, je voudrais juste essayer de l'implémenter comme j'ai fait les deux images :)

Widget de texte de la barre latérale PHP:

    getStyles();

    if (isset($_COOKIE["chosenStyle"]))
    echo "Your current theme is ".$_COOKIE["chosenStyle"].", enjoy!";

    else if (isset($_POST['styles']))
    echo  "Your current theme is". $_POST['styles'].", enjoy!";

    else
    echo "Your current theme is night, enjoy!";
    ?>

EDIT: j'ai maintenant mis à jour mes fichiers de fonctions/en-tête et inclus le nouveau code après l'avoir lu https://stackoverflow.com/questions/5936054/php-set -cookie-issue . La page CSS étant maintenant mise à jour automatiquement, je dois juste changer mon widget texte pour refléter le choix. J'ai toujours le problème de l'en-tête

Fichier functions.php

function setDayHeader(){
         //Set header to day header
         $args = array(
         'width'         => 1000,
         'height'        => 288,
         'default-image' => get_template_directory_uri() . '/images/headers/SomethingOriginalSun.png',
         );
        add_theme_support( 'custom-header', $args );    
}

function setNightHeader(){
         $args = array(
         'width'         => 1000,
         'height'        => 288,
         'default-image' => get_template_directory_uri() . '/images/headers/SomethingOriginalTheMoonAndStars.png',
         );
         add_theme_support( 'custom-header', $args );       
}


function getStyles() {
echo '<form method="post" class="styles" name="styles" action="\">
        <select name="styles">
        <option value="night">Night</option>
        <option value="day">Day</option>
        </select>
        <button class="submit" name="userStyleChoiceForm" onclick="submit">Set style</button></form>';
}

    //Set a cookie for the stylesheet   
    if (isset($_POST["styles"])) { 
        $chosenStyle = ($_POST["styles"]); 
        setcookie("chosenStyle", $chosenStyle ,time()+31536000, "");
        echo "I have set a cookie with the value ".$_COOKIE["chosenStyle"]; 
    }

Header.php

   <!-- if cookie is set, check here and then change style sheet based on cookie -->
<?php
if (!(isset($_POST["styles"]))) { //if post not set (first visit)

    if (!(isset($_COOKIE["chosenStyle"])) || ($_COOKIE["chosenStyle"]) == "night") { //if cookie not set, or is night theme ?>
         <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" />
         <?php
            setNightHeader();
    }
    else { //cookie must be set to day theme, use day ?>
         <link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/style1.css" type="text/css">
         <?php
            setDayHeader();
    }
}

else { //if post is set 

    if (($_POST["styles"]) == "day") { //if they have chosen the day theme ?>
         <link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/style1.css" type="text/css"> <?php
    }

    else if($_POST["styles"] == "night") { //if they have chsoen the night theme ?>
     <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" />  <?php
    }   
 } ?>

J'ai essayé de définir le cookie dans le fichier header.php, mais le message d'erreur "modifier les en-têtes" a alors été généré: |

Je ne suis pas sûr à 100% que je sois même en train de référencer les bonnes variables $ _POST, et j'ai déjà essayé de combiner plusieurs tutoriels que j'ai trouvés, alors toute aide serait la bienvenue! Je me rends compte que je travaille en dehors de mon site principal à la minute dernière, mais il n’a pas encore été lancé, bien que j’espère créer un site factice/test WP afin que je puisse effectuer tous ces tests. autre part. Merci

2
Vixxd

Je sais que ceci est un ancien post et vous avez probablement déjà trouvé une réponse, mais voilà ...

Lorsque vous définissez des cookies, vous devez les inclure dans les en-têtes HTTP, comme expliqué ci-après: http://php.net/manual/en/function.setcookie.php

Cela signifie que vous devez ajouter un point d'ancrage Wordpress semblable à celui-ci dans votre fichier functions.php (non testé) avant que les en-têtes ne soient envoyés.

J'ai utilisé 'template_redirect', mais vous pouvez aussi utiliser 'init'.

add_action( 'template_redirect', 'set_cookie');
function set_cookie() {
    // Set cookie 
    if (isset($_POST["styles"])) {
        setcookie("chosenStyle", $chosenStyle ,time()+31536000, "");
        wp_redirect( home_url() ); // Redirect back to home page 
        exit; 
    }
}

Découvrez les actions/filtres de Wordpress et cette page: http://codex.wordpress.org/Plugin_API/Action_Reference/template_redirect

1
TomC