All in One Seo Pack і MaxCache - вирішення проблеми з title
Вітаю вас, шановні читачі!
Дана публікація присвячена блогерам, які використовують для прискорення движка WordPress кешируєтся плагін MaxCache .
Я, використовуючи MaxCache на даному блозі, несподівано зіткнувся з наступною проблемою: неправильно відображається title, сформований плагіном « All in One Seo Pack »На закеширувалася за допомогою MaxCache сторінці.
Найцікавіше, що я, з того моменту як поставив MaxCache , Не помічав проблеми; адже після публікації я спостерігав некешірованную сторінку, на якій тайтл відображався саме так, як я поставив в налаштуваннях All in One Seo Pack.
Яке ж було моє здивування, коли я помітив, що в кеш потрапляє сторінка зовсім з іншим title! Виявляється, закеширувалася сторінка має тайтл, сформований за замовчуванням стандартною функцією WordPress wp_title () .
Функція wp_title (), за замовчуванням, як title поста використовує його заголовок. А з точки зору SEO, часто виникає завдання зробити тайтл і заголовок поста різними. Та й взагалі, я для всіх своїх постів title вказував в ручну плагіном All in One Seo Pack, шкода свою роботу стає.
Вирішив я боротися з виниклою проблемою.
Що найцікавіше, одночасно зі мною над даною проблемою задумався Tod і, буквально вчора, опублікував пост з варіантом вирішення. Мені описане там рішення не підійшло, т. К. В пості мова йде про плагіні All Meta, яким я не користуюся. І, на скільки я зрозумів, Tod пропонує рішення, яке призведе все до того ж висновку назви посад в title.
Причина виниклої проблеми
Як написав Максим, в кінці сторінки опису плагіна MaxCache , Проблема можлива через буферизації виведення. Думаю, так воно і є, хоча більш детально суть проблеми я не встановив.
Description і keywords, підготовлені плагіном All in One Seo Pack, на закеширувалася сторінку потрапляли справно. Проблема виникала тільки з title.
Справа в тому, що description і keywords виводяться хуком wp_head. Дане питання я наочно висвітлив у відеоуроці по налаштування розділу head в WordPress .
Виходить, що в темі WordPress не потрібно вказувати тегів description і keywords, вони з'являться автоматично після виконання функції wp_head. І все це справа без проблем працює з MaxCache.
А ось з title інша ситуація. Як я показував все в тому ж відеоуроці, нам обов'язково потрібно поставити хоча б порожні теги <title> </ title>, т. К. Вказане в All in One Seo Pack вміст тайтла виводиться саме шляхом заміни тегів <title> теми.
Як же плагін здійснює заміну старого тайтла новим
Плагін All in One Seo Pack використовує механізм буферизації. Буферизація дозволяє, перед виведенням HTML в браузер, відправити його в задану функцію. Функція шукає в переданому буфері теги <title> </ title> і вирізає їх разом з вмістом. На місце вирізаного шматка встає тайтл, підготовлений плагіном. Буферизація закінчується і в браузер потрапляє HTML з підміненим тайтлов.
Переконайтеся в цьому, відкривши на редагування файл aioseop.class.php плагіна All in One Seo Pack. Інструкція
ob_start (array ($ this, 'output_callback_for_title'));
(рядок 106 для плагіна версії 1.6.13.8) якраз включає буферизацію і передає HTML на обробку функції output_callback_for_title.
output_callback_for_title, за допомогою методу rewrite_title () якраз замінює наявний в переданому HTML тайтл на той, що був підготовлений плагіном.
У функції rewrite_title () зустрічається купа умов, які перевіряють яка саме сторінка завантажується (сторінка поста, категорій, тегів і т. Д.). Але кожен раз, після закінчення перевірок, виконується метод replace_title (), який безпосередньо вирізає старий тайтл і вставляє новий.
Так ось ця буферизация з MaxCache не працює нормально. Тому ми підемо іншим шляхом.
Рішення проблеми
Ми будемо брати тайтл, підготовлений All in One Seo Pack, і просто вставляти в HTML сторінки функцією wp_head (), в повній аналогії з description і keywords.
Але, щоб у нас не було двох тайтлів одночасно, старий тайтл за замовчуванням треба виключити з теми. Адже тепер ніякої заміни старого тайтла на новий не буде, буде відбуватися просто вставка нового тайтла, підготовленого плагіном.
Прибрати старий тайтл дуже просто: відкрийте на редагування в текстовому редакторі файл header.php вашої теми і видаліть звідти рядок виведення тайтла: <title> ... </ title>.
Замість трьох крапок може стояти, наприклад, функція виведення тайтла за замовчуванням wp_title ().
Прекрасно, йдемо далі.
Тепер наша увага приковуємо до функції rewrite_title () (рядок 654 файлу aioseop.class.php). Як я говорив вище, дана функція в кожній з гілок умовного оператора «if» виконує метод replace_title ($ header, $ title), який безпосередньо і здійснює заміну старого тайтла новим. На вхід даний метод другим аргументом отримує значення нового тайтла.
Візьмемо дане значення нового тайтла і виведемо за межі методу для подальшого використання. Для цього в кінці функції rewrite_title (), перед оператором return $ header (рядок 820) вкажемо наступну команду:
$ This-> savedtitle = $ title;
Дана команда створює властивість savedtitle у методу rewrite_title (), в яке поміщається значення змінної $ title, якраз містить значення нового тайтла.
Волею розробника All in One Seo Pack, протягом методу rewrite_title (), новий тайтл не завжди знаходиться в змінній $ title. Є дві гілки оператора «if» в яких новий тайтл поміщається в змінну $ new_title і в $ home_title. Щоб вміст цих двох змінних також відправити в властивість savedtitle потрібно прирівняти їх значення змінної $ title:
- під рядком 813 написати $ title = $ new_title;
- під рядком 746 - $ title = $ home_title;
Наступний крок - вирушаємо в метод, що виводить description і keywords на сторінки блогу. У ньому ми додатково виведемо вміст властивості savedtitle методу rewrite_title (), в якому зберігається новий тайтл.
Description і keywords виводиться методом wp_head () (рядок 182). Даний метод здійснює висновок підготовлених description і kewords в рядку 342 операторами
if ($ meta_string! = null) {echo "$ meta_string \ n"; }
Прямо над оператором «if» в попередньому лістингу здійснимо виклик методу rewrite_title () і відправимо вміст властивості savedtitle в виведену змінну $ meta_string.
Ось код, який здійснить задумане:
$ This-> rewrite_title ( ''); $ Meta_string. = "\ N <title>". $ This-> savedtitle. "</ Title> \ n";
Т. е. В підготовлену змінну $ meta_string, що містить description і keywords (а може бути і щось ще), в кінці буде додано рядок нового тайтла.
Взагалі кажучи, проблема на цьому вирішена.
Звертаю вашу увагу, шановний читачу, на той факт, що в процесі редагування файлу aioseop.class.php рядки будуть зміщуватися і, можливо, не збігатися з нумерацією в статті. Також потрібно розуміти, що зазначена нумерація рядків актуальна тільки для версії плагіна 1.6.13.8 - на момент написання статті це найсвіжіша версія плагіна All in One Seo Pack.
Вас вводять в ступор слова «метод», «властивість» і інші PHP-заморочки? - Тоді, спеціально для вас, я опублікував базовий відеокурс по об'єктно-орієнтованого програмування на PHP .
бажаючі можуть скачати виправлений файл aioseop.class.php і його незайману версію (41.3 кБ, * .zip).
PS: Після того, як ви знесли з шаблону стандартний висновок тайтла, необхідно пам'ятати, що за замовчуванням тайтла на сторінках у вас немає і він формується тільки плагіном All in One Seo Pack. Про всяк випадок приведу скрін настройки All in One Seo Pack, який я використовую на своєму блозі (з даними настройками тайтли на всіх сторінках відображаються коректно):
Скріншот клікабельним
З повагою, Андрій Морковин .
Вас вводять в ступор слова «метод», «властивість» і інші PHP-заморочки?