Я працюю з WordPress з незапам’ятних часів, і, хоча я вивчив безліч вихідних кодів цієї CMS, все одно постійно знаходжу нові секрети і тонкощі. Я склав список з 21 поліпшення, який може допомогти в оптимізації WordPress. Сподіваюся, що кожен знайде для себе щось нове в цій статті!

1. WordPress має безліч вбудованих скриптів

Використовуючи чудові функції wp_enqueue_script() і wp_enqueue_style(), ви можете легко підключати власні стилі і скрипти, а також керувати ними. Але чи знали ви, що WordPress має в своєму складі чимало вже готових до використання скриптів? jQuery, його форми і елементи інтерфейсу, SWF-об’єкти, Tiny MCE, Jcrop і Thickbox це найбільш відомі назви, крім багатьох інших. Повний список можна побачити на сайті WordPress Codex.

2. Заміна вбудованих скриптів шляхом скасування їх реєстрації

Можливо, ви захочете використовувати свої версії скриптів замість вбудованих системних. Прикладом цього може слугувати необхідність використання більш нової версії jQuery, ніж встановлена в якості системної. Це може бути зроблено наступним способом:

function my_scripts_method() {
wp_deregister_script( ‘jquery’ ); //скасовуємо реєстрацію системного скрипта jQuery
wp_register_script( ‘jquery’, get_template_directory_uri() . ‘/js/jquery-new.js’); // реєструємо оновлену версію скрипта
wp_enqueue_script( ‘jquery’ ); // і ставимо його в чергу
}
add_action(‘wp_enqueue_scripts’, ‘my_scripts_method’); // вішаємо хук

Але не робіть цього, тільки щоб похвалитися новими вміннями. Як правило, WordPress включає новітню версію jQuery, яка максимально сумісна з CMS і не викликає збої в роботі.

Використовуйте інші версії jQuery тільки коли у вас виникають проблеми з сумісністю, або в разі, якщо визначений плагін вимагає цього.

3. Примусове поліпшення якості JPG зображень

Мій хороший друг Ларс розповів мені, що WordPress не використовує вивід зображень на сайті з 100% якістю, щоб економити дисковий простір і смугу пропускання. Він показав мені вирішення цієї проблеми:

add_filter( ‘jpeg_quality’, ‘smashing_jpeg_quality’ ); //додаємо фільтр
function smashing_jpeg_quality() { return 100; } // визначаємо максимальну якість

За замовчуванням WordPress виводить зображення в якості лише 90%. У багатьох випадках це добре — сумніваюся, що багато відчують різницю. Але якщо наявність на вашому сайті зображень в найкращій якості необхідно (наприклад, для портфоліо), то зміна цього параметра дуже актуально.

4. Перенаправлення на RSS-сервіс FeedBurner

FeedBurner використовується майже в кожному блозі, з яким я працював. І я не знаю кращого сервісу для розширення RSS-функцій вашого сайту. Висловлюю подяку Elio за написану ним статтю «10 Tips to Optimize Your WordPress Theme», яка містить наступний код:

add_action( ‘template_redirect’ , ‘smashing_rss_redirect’);
function smashing_rss_redirect() {
if ( is_feed() AND !preg_match( ‘/feedburner|feedvalidator/i’, $_SERVER[‘HTTP_USER_AGENT’]) ){
header( ‘Location: http://feeds.feedburner.com/my_smashing_feed’ ); header( ‘HTTP/1.1 302 Temporary Redirect’ );
}
}

Даний код дозволяє замінити посилання вашого сайту (наприклад, http://mysite.com/feed) посилання безпосередньо на сервіс FeedBurner: http://feeds.feedburner.com/mysite.

5. Використання загальних функцій таксономічних

Безліч таксономічних функцій допоможе вам створити власні таксономії. Також можна скористатися вбудованими тегами і категоріями. Перейшовши за посиланням на WordPress Codex можна побачити повний список таксономічних функцій. Я використовую функції get_term(), get_terms() і wp_get_object_terms(). Щоб максимально структурувати свій сайт, я максимально повно використовую дані функції, навіть для тегів і категорій.

6. Налаштування сесій у WordPress

Механізм сесій допомагає зберігати інформацію про попередні дії користувача і його налаштуваннях. Він широко використовується на багатьох веб-сайтах. В WordPress сесії за замовчуванням. Використовуючи такий метод, ви можете відкрити сесію для використання на всіх сторінках свого сайту.

add_action( ‘init’, ‘smashing_session_start’ ); // вішаємо хук
function smashing_session_start() {
if ( !session_id() ) { // якщо сесія ще не існує, то починаємо її
session_start();
}
}

Механізм сесій досить безпечний, якщо ви не передаєте конфіденційних даних.

7. Список усіх функцій-хуків

Я почав писати таку функцію. Але коли я скористався пошуком в Google, то знайшов те, що мені було потрібно:

function list_hooked_functions($tag=false){
global $wp_filter;
if ($tag) {
$hook[$tag]=$wp_filter[$tag];
if (!is_array($hook[$tag])) {
trigger_error(«Nothing found for ‘$tag’ hook», E_USER_WARNING);
return;
}
}
else {
$hook=$wp_filter;
ksort($hook);
}
echo «;
foreach($hook as $tag => $priority){
echo «
>>>>>t$tag
«;
ksort($priority);
foreach($priority as $priority => $function){
echo $priority;
foreach($function as $name => $properties) {
echo «t$name
«;
}
}
}
echo «;
return;
}

Використовуючи цю функцію без аргументів, ви отримаєте список усіх функцій-хуків. Але так, як цей список може бути досить великим, то ви можете його уточнити, вказавши конкретне ім’я функції. Цей прийом можна використовувати при налагодженні або настроювання властивостей хуків. Дуже корисно знати, що і в якому порядку ви повісили, наприклад, на функцію wp_head(). І дана функція в цьому випадку просто незамінна!

8. Автоматичне додавання параграфа до будь-якого елементу

WordPress робить це автоматично для контенту, але немає причин не використовувати цю можливість в інших випадках. Функція, яка відповідає за додавання параграфів, називається wpautop().

$my_text = ‘Welcome! Smashing Magazine is a great place to learn new things. I hope you’re having a nice time!’;
echo wpautop( $my_text );

Іноді вам потрібно відключити використання даного фільтра за замовчуванням. Тоді вам потрібно буде відключити його наступним чином:

remove_filter( ‘the_content’, ‘wpautop’ );
remove_filter( ‘the_excerpt’, ‘wpautop’ );

9. Розсилка електронних листів за допомогою WordPress

Нещодавно я публікував свою статтю «Creating Perfect Emails for Your WordPress Website», в якій було наведено приклад використання функцій wp_mail(). Ця група функцій дозволяє вам використовувати вбудовані в WordPress можливості відправки електронних повідомлень користувачам.

$message = ‘Hello, thanks for reading my post! I hope to see you back soon.’; // наше повідомлення
wp_mail( ‘[email protected]’, ‘Thanks for reading my post!’, $message); // відправляємо нашу рядок повідомлення адресату

Ви також можете відсилати HTML-вміст, використовуючи фільтр:

add_filter («wp_mail_content_type», «smashing_mail_content_type»); // додаємо фільтр
function smashing_mail_content_type() { // функція, що повертає тип вмісту
return «text/html»;
}

10. Вбудована пагинация

Шість місяців тому, для мене стало сюрпризом, що можна обійтися без використання сторонніх плагінів і, використовуючи стандартні засоби, реалізовувати пагінацію (тобто розбиття на сторінки). Вбудована функція paginate_links() дозволяє посторінково розбивати будь-який тип вмісту.

// Пагинация для циклів WordPress
$list = new WP_Query( $query_args ); // отримання списку елементів
$pagination = array( // масив для зберігання елементів
‘base’ => str_replace( 99999, ‘%#%’, get_pagenum_link( 99999 ) ),
‘format’ => ‘?paged=%#%’,
‘current’ => max( 1, get_query_var( ‘paged’ ) ),
‘total’ => $list->max_num_pages,
‘next_text’ => ‘next’,
‘prev_text’ => ‘попередній’
);
echo’
‘. paginate_links( $pagination ) . ‘
‘; // вивід на екран
// Пагинация для будь-якого елемента
$list = range(1, 100); // список елементів
$items_per_page = 12; // елементів на сторінці
$pagination = array( // масив для зберігання елементів
‘base’ => get_bloginfo( ‘url’ ) . ‘/mypage/%_%’,
‘format’ => ‘?paged=%#%’,
‘current’ => $_GET[‘current_page’],
‘total’ => ceil( max($list) / $items_per_page ),
‘next_text’ => ‘go forth’,
‘prev_text’ => ‘go back’
);
echo’
‘. paginate_links( $pagination ) . ‘
‘; // вивід на екран

11. Простий спосіб завантаження файлів

У WordPress є безліч різних функцій для завантаження. Найбільш простий функцією є wp_upload_bits(), яка завантажує файл із зазначеним вмістом в папку з завантаженнями:

$upload = wp_upload_bits( $_FILES[‘myfile’][‘name’], null, file_get_contents( $_FILES[‘myfile’][‘tmp_name’] ) ); // функція завантажує вказаний в параметрах файл і повертає в змінну $upload масив з інформацією про файл
echo ‘Well uploaded! The path to this file is ‘ . $upload[‘file’] . ‘and the url to this file is’ . $upload[‘url’]; // висновок повідомлення про успішне завантаження

12. Відображення часу в стилі Twitter

Інший момент істини для мене настав (враховуючи, що я використовую WordPress ще з версії 1.5), коли я дізнався, що стандартними засобами CMS можна відображати відносний час у людино-зрозумілому форматі, наприклад «5 хвилин назад» або «один місяць тому», використавши функцію human_timed_diff():

$diff = human_time_diff( ‘2012-05-05 12:05:00’, ‘2012-05-05 12:10:00′ ); // вказуємо проміжок часу
echo «This comment was submitted’ . $diff . ‘ago’; // вивід рядка: «Цей коментар був залишений 5 хвилин тому»

13. Вхід від імені будь-якого користувача

Якщо ви створюєте складний сайт з досить великим персоналом, і маєте необхідність оперативно перемикатися між їх акаунтами, то вам це може бути корисно. Функція wp_set_auth_cookie() дозволяє вам входити під ім’ям користувача, використовуючи номер ID.

$user_id = 4; // вибір id
wp_set_auth_cookie( $user_id ); // вибір cookie-файлу

Будьте обережні при використанні цієї функції. Якщо не повернути значення у вихідне, то кожен користувач, який буде входити, буде потрапляти на панелі керування користувача з id=4. Навіть під час тестування, я роблю прив’язку до свого IP або навіть спеціальній URL-рядок для надійності. Можна рекомендувати використовувати цю функцію з великою обережністю.

14. Додавання полів у профіль користувача в адміністративній панелі

Не можна сказати, що WordPress надає багато можливостей для налаштування профілю в панелі адміністрування. Особливо актуально це в наші дні, коли бажано заповнювати інформацію про акаунти в різних соціальних мережах, де зареєстрований автор. Але, на щастя, це легко виправити. Погляньте на наступний код:

Соціальні мережі

Twitter
Ваше ім’я користувача Twitter
Facebook
Посилання на ваш аккаунт в Facebook
Linkedin
Посилання на ваш аккаунт в LinkedIn

15. Легка перевірка URL-адрес

Коли ви працюєте з URL, завжди стежте за тим, щоб вони були правильно сформовані та не містили в собі заборонені символи. Функція esc_url() допоможе вам це зробити:

$my_url = ‘http://mypage.com/?awesome=true’; // URL для перевірки
$url = esc_url( $my_url ); // передаємо його в функцію

Також, рекомендую ознайомитися зі списком інших подібних функцій.

16. Оптимізація використання текстових віджетів

Щоб полегшити використання текстових віджетів, використовуйте для них шорткоди (shortcodes). Для розробників тем (themes) це відмінний спосіб підвищити гнучкість свого продукту для кінцевого користувача.

add_filter( ‘widget_text’, ‘do_shortcode’ ); // додаємо шорткод до віджету

17. Додавання настроюваних типів записів в RSS-стрічку

Неможливість зробити це з адміністративної панелі, доставляє багато незручностей. Більшість розробників сайтів поділяють контент з окремих записів, і хочуть бачити їх все в стрічці RSS. Не турбуйтеся — функція для цього:

add_filter(‘request’, ‘smashing_custom_feed’); // додаємо фільтр
function smashing_custom_feed( $vars ) {
if ( isset( $vars[‘feed’] ) ) { // перевіряємо, чи існує масив $vars
$vars[‘post_type’] = get_post_types(); // якщо так, то записуємо у відповідний елемент масиву всі зареєстровані типи записів
}
return $vars; // повертаємо масив
}

Наведена вище функція хороша, але записує ВСІ зареєстровані типи функцій в RSS-фід. Якщо ви хочете додати тільки певні типи записів, то ось така функція:

add_filter(‘request’, ‘smashing_custom_feed’);
$post_type_list = array( ‘post’, ‘products’ ); // створюємо масив зі списком потрібних типів
function smashing_custom_feed( $vars ) {
if ( isset( $vars[‘feed’] ) AND !isset( $vars[‘post_type’] ) ) {
$vars[‘post_type’] = $post_type_list; // після перевірки на те, встановлено значення чи ні, присвоюємо масиву наш список імен.
}
return $vars;
}

18. Не порушуйте механізм функціонування циклів WordPress

Множинні цикли дуже корисні, але можуть завдати шкоди при необережному використанні. Щоб переконатися, що ваші цикли працюють нормально і не порушують роботи глобальних функцій, зберігайте оригінальний запит тимчасової змінної.

$tmp_query = $wp_query; // зберігаємо під тимчасової змінної
query_posts(‘cat=5&order=ASC’); // вибираємо категорію і порядок
while( have_posts() ) : the_post() // цикл виводу
?>
users ORDER BY user_registered DESC LIMIT 0,10″ ); // виведення списку всіх зареєстрованих користувачів

Цей клас має багато можливостей.

20. Налаштування ревізій (збережених версій записів) у WordPress

Ревізії записів в WordPress цей потужний, але рідко використовується більшістю користувачів інструмент. Записи для ревізій створюються в базі даних, навіть якщо не використовуються. Це може негативно позначитися на продуктивності роботи великих сайтів. Тому, якщо ви не використовуєте ревізії, то вимкніть їх, розташувавши наступний код у файлі wp-config.php:

// Щоб заборонити ревізії: define( ‘WP_POST_REVISIONS’, ‘FALSE’);
// Щоб обмежити їх кількість: define( ‘WP_POST_REVISIONS’, 5 );

21. Налаштування стилів коментарів для автора

Якщо ви хочете виділити коментарі автора, то використовуйте стильової клас bypostauthor:

li.bypostauthor { background:#fafafa; color:#555; }

22. Збереження цілої сторінки в змінної

У деяких випадках, збереження виводу сторінки або її частини в змінної може бути дуже корисним. Це дозволяє вам легко вносити зміни, які іншими способами зробити не можна, а також стискати дані при передачі їх користувачеві. Для організації буфера виведення нам потрібно створити два хука.

add_action(‘wp_head’, ‘smashing_buffer_start’);
add_action(‘wp_footer’, ‘smashing_buffer_end’);
function smashing_buffer_start() {
ob_start( ‘smashing_callback’ ); // включаємо буферизацію виводу
}
function buffer_end() {
ob_end_flush(); // звільняємо (виводимо) буфер висновку і вимикаємо буферизацію виводу
}
function smashing_callback( $content ) {
// тут ви можете робити все, що завгодно зі своїм контентом
$content = str_replace( ‘great’, ‘високий’, $content );
echo $content;
}

Переклад статті «Powerful WordPress Tips And Tricks» був підготовлений дружною командою проекту Сайтостроение від А до Я.