atticus
  • 0
Новичок

Настройка пользовательских файлов cookie в WordPress

  • 0

Я пытаюсь установить файлы cookie для перенаправления возвращающихся пользователей на мою определенную страницу на моем сайте WordPress.

Я хотел бы получить совет по этим 2 вещам:

  1. Где в php-файлах WordPress следует проверять файлы cookie перед загрузкой любого контента для обработки перенаправления? Есть ли хороший файл, в котором он должен существовать по сравнению с другими?
  2. Как правильно установить файл cookie в WordPress? setcookie('cookie_name', 'cookie_value', time()+4000); похоже, в моей системе не сохраняются файлы cookie.
Share
  1. Ах, понял, что мне нужно подключить это к init(). РЕШЕНИЕ: я создал функцию в functions.php, которая будет устанавливать и проверять куки. чтобы это работало правильно, после определения функции вне вызова функции выполните следующее: add_action(‘init’, ‘имя-функции’);

    • 0
  2. 1 — Вы можете проверить наличие файлов cookie и выполнить перенаправление с помощью хуков, которые вызываются перед любым выводом, например, хук «init»:

    <?php
    
    // Hook the function "redirect()" on to the "init" action
    add_action('init', 'redirect');
    
    // redirect() may redirect the user depending on the cookies he has
    function redirect(){
      /* CODE */
    }
    
    ?>
    

    2. Лучший способ установить файлы cookie — использовать хук «init» следующим образом:

    <?php
    
    add_action('init', 'my_setcookie');
    
    // my_setcookie() set the cookie on the domain and directory WP is installed on
    function my_setcookie(){
      $path = parse_url(get_option('siteurl'), PHP_URL_PATH);
      $host = parse_url(get_option('siteurl'), PHP_URL_HOST);
      $expiry = strtotime('+1 month');
      setcookie('my_cookie_name_1', 'my_cookie_value_1', $expiry, $path, $host);
      /* more cookies */
      setcookie('my_cookie_name_2', 'my_cookie_value_2', $expiry, $path, $host);
    }
    
    ?>
    

    Это более последовательно, если у вас есть блог по адресу http://www.example.com/blog, файлы cookie не будут доступны по адресу


    Обновлять

    вы также должны иметь возможность использовать константы COOKIE_PATH и COOKIEDOMAIN, а не выяснять их самостоятельно, что я только что заметил в ответе Андре Р. Коля — drzaus

    • 0
  3. Вы, вероятно, должны использовать константы COOIKEPATH и COOKIE_DOMAIN, существующие с WP 3.0

    setcookie("your_cookie", $your_value, time()+3600, COOKIEPATH, COOKIE_DOMAIN);
    
    • 0
  4. Ах, понял, что мне нужно подключить это к файлу init() .

    РЕШЕНИЕ: я создал функцию в functions.php, которая будет устанавливать и проверять куки. чтобы это работало правильно, после определения функции вне вызова функции это:

    add_action('init', 'function-name'); 
    
    • 0
  5. Этот способ работал:

        add_action( 'init', 'function-to-setcookie' ); 
    
        function function-to-setcookie(){
    
            //use condition here , in which page you eant to set cookie
            //choose a page where you want the cookie to be set
            $pageurl = get_option('siteurl').'/set-cookie-page'; 
    
           // use a function to get current page url and use condition 
           //to match it with the desired page where you want to set cookie 
           if ( $pageurl === current_page_url() ) {
               setcookie( 'cookie_name', 'cookie_value', $expiryTime, $cookiepath, $siteurl );
             }
    
        }
    
    • 0
  6. Вы захотите удалить свой файл cookie до того, как какой-либо контент будет записан на страницу (до отправки заголовков).

    Чтобы установить файл cookie, укажите путь, домен, а также я рекомендую установить для последних 2 параметров значение true ( $secure и $httponly ). Вам также нужно будет указать те же параметры setcookie() при удалении, кроме $expiry (который должен быть отрицательным) и $value (который должен быть пустым »).

    Если вы передаете json через файл cookie, похоже, вам base64_encode это тоже нужно, иначе он не будет правильно декодировать.

    Все это должно быть сделано в классе, чтобы вы могли получить доступ к значению файла cookie позже в своем коде. Класс можно добавить в плагин или functions.php.

    Вот пример, где мы используем файл cookie для хранения ответа на действие, чтобы затем отобразить его пользователю после перенаправления:

    class my_custom_class {
    
        const MY_COOKIE_NAME_JSON = 'my_cookie_name_json';
        const COOKIE_LIFETIME = 3600;
    
        private $cookie_value;
    
        function __construct() {
            // ensure you are deleting cookie before headers are sent
            add_action('init', [$this, 'process_cookie_json'], 10);
            // uses bootstrap alert to format return message
            add_filter('the_content', [$this, 'filter_the_content_in_the_main_loop'], 1);
        }
        
        static function some_action_that_sets_the_cookie($message, $response_type = 'success') {
            $responses = [];
            if (isset($_COOKIE[self::MY_COOKIE_NAME_JSON]))
                $responses = json_decode(base64_decode($_COOKIE[self::MY_COOKIE_NAME_JSON]));
            $responses[$response_type][] = $message;
            self::set_cookie_json($responses);
        }
        
        static function set_cookie_json(array $cookie_value) {
            setcookie(self::MY_COOKIE_NAME_JSON, base64_encode(json_encode($cookie_value)), time() + self::COOKIE_LIFETIME, "/", $_SERVER['HTTP_HOST'], true, true);
        }
        
        function process_cookie_json() {
            if (!isset($_COOKIE[self::MY_COOKIE_NAME_JSON]))
                return false;
            $this->cookie_value = json_decode(base64_decode($_COOKIE[self::MY_COOKIE_NAME_JSON]), true);
            setcookie(self::MY_COOKIE_NAME_JSON, '', -1, "/", $_SERVER['HTTP_HOST'], true, true);
            unset($_COOKIE[self::MY_COOKIE_NAME_JSON]);
        }
    
        function filter_the_content_in_the_main_loop($content) {
            if (!$this->cookie_value || !is_array($this->cookie_value))
                return $content;
            $alerts = [];
            foreach ($this->cookie_value as $response_type => $messages)
                $alerts[] = '<div class="alert alert-' . $response_type . '" role="alert">' . implode(PHP_EOL, $messages) . '</div>';
            return implode(null, $alerts) . $content;
        }
    
    }
    
    $my_custom_class = my_custom_class;
    

    Затем вы можете установить файл cookie с помощью:

    my_custom_class::some_action_that_sets_the_cookie('the message');

    • 0

Оставить ответ

You must login to add an answer.