Главная JavaScript

jQuery: решение проблемы с куками на WordPress при использовании MaxCache

Этот пост адресован пользователям WordPress, у которых стоит кэширование с помощь MaxCache. WordPress имеет в своем функционале две очень хорошие особенности, которые повышают юзабилити сайта для посетителей, оставляющих комментарии: Однажды оставив одобренный администратором сайта комментарий, посетитель избавляется от необходимости при каждом следующем комментарии вновь вводить ...

Комментарии (75)

  1. Огромное спасибо, Димокс! В закладки и блог-шоу однозначно!

  2. Большое спасибо!

    И проблема решена важная и статья познавательная.

  3. Дима, я так подумал, наверное всё-таки правильней в форме прицепиться не к id, а к name. В WordPress’е эти name стандартные, а id, как ты и написал, могут меняться. Так что переход к name гарантирует работу (заполнение полей) с любым шаблоном.

  4. Ура, данные сохраняются :)

  5. Хм, только что-то после добавки предыдущего коммента моё имя само изменилось сами видите на что.

  6. Я вот глянул, а оно будет куки в днях хранить? Может было бы лучше в Unix?

  7. Чтобы писать $, а не $j
    Можно весь свой скрипт обернуть в такую конструкцию, это самый правильный вариан:
    (function ($){
    здесь ваш скрипт…
    })(jQuery);

  8. Спасибо Dimox огромное, давно искал +один подписчик

  9. Тоже кириллические имена сохраняются как смайлики.

    • Да, есть такая проблема. Пока не знаю, как решить.

      • У меня выскочила аналогичная проблема, Джаваскрипт вычитывает из куков не совсем так как хотелось бы. К примеру:
        русс = %D1%80%D1%83%D1%81%D1%81;
        unescape ('%D1%80%D1%83%D1%81%D1%81') = русс;

        Решается проблема следующим методом:

        var cookie = {
        	// public method for Cookie decoding
        	decode : function (string) {
        		return this._utf8_decode(unescape(string));
        	},
        	// private method for UTF-8 decoding
        	_utf8_decode : function (utftext) {
        		var string = "";
        		var i = 0;
        		var c = c1 = c2 = 0;
        		while ( i < utftext.length ) {
        			c = utftext.charCodeAt(i);
        			if (c < 128) { string += String.fromCharCode(c); i++; }
        			else if((c > 191) && (c < 224)) {
        				c2 = utftext.charCodeAt(i+1);
        				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
        				i += 2;
        			}
        			else {
        				c2 = utftext.charCodeAt(i+1);
        				c3 = utftext.charCodeAt(i+2);
        				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
        				i += 3;
        			}
        		}
        		return string;
        	}
        }
        

        В результате:
        cookie.decode ('%D1%80%D1%83%D1%81%D1%81') = русс

  10. Я бы назвал все вышеизложенное «ПерАнусДерАстро» :-D
    Все можно сделать гораздо проще.
    1. Удалить из кеша страницу с комментарием, и для этого пользователя (однократно) вывести лайф версию.
    2. Не писать новые свои куки, а взять родные которые создал Вердпресс, и джаваскриптом распихать в инпуты.

    Таким образом не придется править код при обновлении движка.

    Пример скрипта который надо впихнуть в свой шаблон комментариев:

    function searchCookie (name)
    {
    var cookie = «» + document. cookie;
    var search = «» + name;
    var setStr = null;
    var offset = 0;
    var end = 0;
    if (cookie.length > 0) {
    offset = cookie. indexOf (search);
    if (offset ≠ -1) {
    offset += search. length;
    end = cookie. indexOf («;», offset)
    if (end == -1) {
    end = cookie. length;
    }
    setStr = cookie. substring (offset, end);
    begin=setStr.indexOf ('=')+1;
    setStr = unescape (setStr.substring (begin, setStr. length));
    }
    }
    return (setStr);
    }
    function getToInput ()
    {
    var arg = getToInput. arguments;
    if (!arg[0]) arg=new Array ('author','email','url');

    if (document.cookie)
    {
    var commData=new Array (searchCookie ('comment_author'), searchCookie ('comment_author_email'), searchCookie ('comment_author_url'));
    if (!commData.join ('')) return false;
    for (i=0;i<3;i++)
    {
    obj=document.getElementById (arg[i]);
    if ((obj) && (obj.value=='')) obj. value=commData[i];
    }
    }
    }
    // инициализация обязательно вставить после вывода инпутов.
    getToInput ('author','email','url');

    • 1. Удалить из кеша страницу с комментарием, и для этого пользователя (однократно) вывести лайф версию.

      Как удалить из кеша страницу с комментарием? И что такое «лайф версия»?

      • Как удалить из кеша страницу с комментарием?

        Для этого в файле wp-comments-post.php (в корне сайта) добавить
        перед wp_redirect ($location); ?> (строка находится в самом конце файла) setcookie ('comment','clearCache');

        а в начале функции max_cashe () после

        	$dir = realpath(dirname(__FILE__)) . '/cache/';
        	$filepath = $dir . md5($url);
        

        вставить:

        	if ((isset($_COOKIE) && strstr(implode($_COOKIE), 'clearCache')))
        	{
        		if (is_file($filepath)) unlink($filepath);
        		$my_cache_no = true;
        		setcookie('comment','');
        		return false;
        	}
        

        И что такое «лайф версия»?

        Версия не из кеша.

        • Ой там не $my_cache_no = true;, а наверное $max_cache_no = true;
          Не знаю точно, пока оригинального кода Max’a не видел. Но идея я думаю понятна?

          • Тут вот в чем дело. В платной версии это уже все работает автоматом. Поэтому ничего менять и доделывать не нужно. :)

            А вот что касается использования родных куков вместо своих — нужно думать. То что не нужно менять шаблон заманчиво, но отлавливать и устанавливать куку нужно до отработки WordPress и тут может быть сложность: в WordPress редиректы при комментировании. Кроме этого кука сама по себе отлавливается WordPress’ом в своих недрах и явно подставляется в инпуты в value. То есть на уровне html-кода. Так что вариант Димы более надежен.

            • Мы сейчас говорим, не о подстановке куков в вордпресовскую версию, а о подстановке куков в кешированную версию, где поля (по идее) всегда должны быть чистыми.

              Кроме того, джаваскриптовые функции можно внедрять в момент кеширования только в кешированные версии. В таком случае даже рекомендаций по изменению шаблона не нужно будет делать.

              • Кешированная страница отдается как есть голой статикой. В ней если и использовать куки, то только на уровне js. Но внедрять js в кэшированную версию не есть хорошо. Код должен оставаться чистым, так как его отдает WordPress.

  11. Мм, мучился мучился. Вроде все условия выполнены, но во-первых, так и не заработало, а во-вторых, «редактор» вместо простановки тегов лепит мне.
    Скрин вот

  12. Dimox, так и не понял как подключить скрипт (весь блог прошерстил), если мне нужна только вторая его часть.

    Просто добавляю код скрипта в какой-то JS-файл на сайте и подлючаю его?

    очень нужно

    • Вторая часть без первой работать не будет, т. е. нужно использовать весь скрипт.

      Просто добавляю код скрипта в какой-то JS-файл на сайте и подлючаю его?

      Да, если все условия, на которые я обратил внимание в статье, выполнены.

  13. Мда, не знал, что jquery можно использовать и для таких вещей.
    А можно ли узнать по-подробнее насчёт эффективности maxcache? Просто не нашёл на этом блоге. Может, плохо искал? :)

    • А можно ли узнать по-подробнее насчёт эффективности maxcache?

      На странице скрипта вы найдете подробную информацию об этом. Я же лишь скажу, что разница с вариантом, когда этот скрипт не используется, огромна.

  14. т. е. чтобы подключить ваш файл нужно:
    в шаблоне с темой, в файле (header.php) прописать строчку

    Затем сохранить Конечный код jQuery-скрипта с любым названием, с расширением js, т. е. допустим файл будет иметь название — comments. js Загружаем его в любую директорию на сайт, и аналогично подключаем его в header. php

    И все? Верно?

  15. Спасибо. Мне первая часть скрипта помогла.
    Не подскажете, вот этот код:

    if (/opera/.test (userAgent)) { var top = 'html'; } else { var top = 'html, body'; }

    , что там Опера не так обрабатывает? Просто не припоминаю, чтоб у меня с ней проблемы были. Мне для общего развития. ;)

    И еще вопрос. Хочу сделать так, чтоб в случае если в браузере куки от меня отсутствуют, в поля вводилась пару слов, типа «здесь имя», а «здесь почта». Я так понимаю — к строчке ниже надо прикрутить конструкцию else?

    if (author) $j ('input[name="author"]').val (author);

    if (author) $j ('input[name="author"]').val (author) else $j ('input[name="author"]').val ('Ку-ку');

    — что-то типа этого?
    Я еще, почитаю, ваш блог. В любом случае, надо с jQuery потихоньку разбираться.
    Может в литературу, на ваш взгляд хорошую, ткнете? О программировании понятие имею, c jQuery сегодня вот, столкнулся.

  16. Скрипт помогает не только при использовании кеширующего скрипта Максима. Есть шаблоны, в которых и без него эта проблема существует. То, что комментарий ушел на модерацию видно, а вот данные свои приходится вводить в поля по новой каждый раз. Вчера выяснилось, что этим грешат шаблоны от yootheme.com. Лень было разбираться, впихнули этот скрипт, и все заработало как нужно. Так что спасибо за скрипт.

  17. Здравствуйте.
    Вижу. что вы неплохо разобрались с плагином MaxCache. Может дадите несколько советов по работе с ним.
    Меня интересует, как можно реализовать одновременную работу ЧПУ и MaxCache.
    С пустым. htaccess скрипт отлично работает, но, когда включаю mod_rewrite, возвращаются тормоза.
    Спасибо!

  18. С русскими никами проблему никак не решили? (в chrome работает корректно, а firefox заменяются на разные символы типа: @0>@?2)

  19. Отлично! Только вчера начал использовать MaxCache и сразу решил устранить некоторые баги. С Вашим скриптом всё получилось с первого раза! Сам попробовал оставить комментарий — вроде бы все сохранилось… Спасибо большое)))

  20. Расскажите подробнее. Я установил скрипт Максима. Теперь хочу по Вашей статье установить эти скрипты. Но не знаю, как подключить их к сайту. Информации более нигде не нашел. Спасибо.

Ваш комментарий