All in One Seo Pack і MaxCache - вирішення проблеми з title

  1. Причина виниклої проблеми
  2. Як же плагін здійснює заміну старого тайтла новим
  3. Рішення проблеми

Вітаю вас, шановні читачі!

Дана публікація присвячена блогерам, які використовують для прискорення движка 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, який я використовую на своєму блозі (з даними настройками тайтли на всіх сторінках відображаються коректно):

Про всяк випадок приведу скрін настройки All in One Seo Pack, який я використовую на своєму блозі (з даними настройками тайтли на всіх сторінках відображаються коректно):

Скріншот клікабельним

З повагою, Андрій Морковин .

Вас вводять в ступор слова «метод», «властивість» і інші PHP-заморочки?