25+ хуків functions.php для теми

Колекція корисних сніпетів (кодів). Коди розраховані на часті завдання під час редагування або створення теми.

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

// підключаємо сніпети
require_once 'functions-snippets.php';
Зміст:


Зовнішній вигляд


CSS для TinyMCE редактора

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

// Стилі для TinyMCE редактора
// Потрібно створити файл 'editor-styles.css' у папці теми
add_action( 'current_screen', 'my_theme_add_editor_styles');
function my_theme_add_editor_styles() {
	add_editor_style('editor-styles.css');
}


CSS для сторінки входу (login)

Підключає файл css на сторінці авторизації. Завдяки цьому ми можемо повністю змінити вигляд сторінки входу.

## CSS для сторінки входу (login)
## Потрібно створити файл 'wp-login.css' у папці теми
add_action('login_head', 'my_loginCSS');
function my_loginCSS() {
	echo '<link rel="stylesheet" type="text/css" href="'. get_template_directory_uri() .'/wp-login.css"/>';
}


CSS для адмін-панелі

Підключає файл стилів на всі сторінки адмін панелі. Так, можна зручно переробляти та доповнювати стилі адмінки.

## CSS стилі для адмін-панелі. Потрібно створити файл 'wp-admin.css' у папці теми
add_action('admin_enqueue_scripts', 'my_admin_css', 99);
function my_admin_css(){
	wp_enqueue_style('my-wp-admin', get_template_directory_uri() .'/wp-admin.css' );
}


Видалення Адмін-бару з фронт-енду

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

## Видаляє Адмін-бар з фронт-енду
add_filter( 'show_admin_bar', '__return_false');

У статті 10 прийомів з адмін-баром є ще купа прикладів. Наприклад, не прибирати бар, а сховати його під заначок та наведення мишки. Адмін-бар все ж таки зручна штука…


Зміна тексту у підвалі адмін-панелі

Змінює повідомлення, які виводяться у підвалі адмінки. Туди можна розмістити свої реквізити – автора теми.

## Зміна тексту в підвалі адмін-панелі
add_filter('admin_footer_text', 'footer_admin_func');
function footer_admin_func() {
	echo 'Розробка теми: <a href="#" target="_blank">Ваше ім'я</a>. Працює на <a href="http://wordpress.org" target="_blank">WordPress</a>.';
}


max-width для об’єктів, що вбудовуються в запис (Youtube)

Коли ми вставляємо посилання на аудіо або відео, WP автоматично вбудовує код для такого посилання і показує, наприклад, програвач Youtube. Цим хаком можна вказати максимальну ширину для такого об’єкта.

## max-width для об'єктів, що вбудовуються в запис (Youtube)
if ( ! isset ( $content_width ) )
$content_width = 660;


Функціонал


Активація підтримки віджетів для сайдбару

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

## Включаємо підтримку віджетів. Додаємо область для віджетів
if( function_exists('register_sidebar') ){
	register_sidebar(array(
		'before_widget' => '<aside>',
		'after_widget' => '</aside>',
		'before_title' => '<h3>',
		'after_title' => '</h3>',
	));
}


Активація підтримки довільного меню

Реєструє область (місце) для меню та включає підтримку меню. Після встановлення цього коду в адмін-панелі з’явиться можливість створювати довільні меню та прикріплювати їх у створені цим кодом області. У шаблоні меню виводиться функцією wp_nav_menu() .

## Add custom menus
register_nav_menus( array(
	'main' => 'Головне меню',
	'in_footer' => 'Меню в підвалі',
)));

Детальніше про цю справу читайте в register_nav_menus()


Додаємо посилання на RSS фід записів та фід коментарів у <head>

З версії 3.0. такі посилання були відключені і більше не відображаються за замовчуванням. Якщо їх все ж таки потрібно показувати, то їх можна включити таким кодом:

## Додаємо посилання на RSS фід записів та фід коментарів у `<head>`
add_theme_support( 'automatic-feed-links');

Виведе:

<link rel="alternate" type="application/rss+xml" title="Мій сайт / Feed" href="http://example.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Мій сайт / Comments Feed" href="http://example.com/comments/feed/" />

Докладніше про цю функцію читайте в add_theme_support()


Настроювана фонова картинка або фон

Дозволяє змінювати фонову картинку або просто колір фону з адмін-панелі з розділу «Зовнішній вигляд». Докладніше add_theme_support()#custom-background

## Включає можливість встановлювати фонову картинку з адмінки
add_theme_support( 'custom-background');

В результаті код виведе:

<style type="text/css" id="custom-background-css">
body.custom-background { background-color: #bdd96e; }
</style>


Включення шорткодів у віджет «Текст»

Багато плагінів використовують шотрокди, але не у всіх є віджети. У такому разі було б зручно використовувати шорткод плагіна у віджеті «Текст».

## Шорткоди у віджеті "Текст"
if( ! is_admin() ){
	add_filter('widget_text', 'do_shortcode', 11);
}


Випадковий текст за промовчанням у полі контенту в адмінці

При створенні нового запису (поста чи сторінки) іноді зручно, щоб там були якісь нотатки, пояснення, як і що потрібно писати. Для цього можна вставляти в контент дефолний текст:

## Випадковий дефолтний текст для редактора
add_filter( 'default_content', 'writing_encouragement_func');
function writing_encouragement_func( $content ) {
	Global $post_type;

	// Тексти для редактора, тип запису post
	if( $post_type == 'post' ){
		$array = array(
			'Якесь повідомлення',
			'<h1>Якесь повідомлення</h1>',
		);

		return $array[array_rand($array)];
	}
	// Тексти для редактора, тип запису
	else {
		$array = array(
			'Якесь повідомлення',
			'<h1>Якесь повідомлення</h1>',
		);

		return $array[array_rand($array)];
	}
}

Також можна додати текст для заголовків та окремих типів записів, детальніше читайте тут: the_editor_content()

І ще стаття на цю тему: Заздалегідь встановлений текст для нового посту


Змінити кількість записів на сторінці пошуку

За замовчуванням на сторінці пошуку показується стільки ж записів на сторінці, скільки і скрізь, скільки виставлено в налаштуваннях.

Цей приклад показує, як вивести 100 записів на сторінці.

## change amount of posts on search page - set here to 100
add_action( 'pre_get_posts', 'search_results_per_page_func');
function search_results_per_page_func( $query ) {
	// запит на сторінці пошуку
	if( ! is_admin() && $query->is_main_query() && $query->is_search() ){
		$query->set( 'posts_per_page', 100);
	}

	return $query;
}

Ще приклади з хуком pre_get_posts дивіться тут .


Посилання «Читати далі…» після цитати у циклі. Заміна […]

Видаляє стандартну триточку […] після короткого опису кожного посту в циклі та замінює його на текст із посиланням на запис, наприклад «читати далі…».

## Посилання «Читати далі...» після цитати у циклі. Заміна `[...]`
add_filter('the_excerpt', 'replace_excerpt_func');
function replace_excerpt_func( $content ){
	$link = '<a class="read_more" href="'. get_permalink() .'">Читати далі...</a>';
	return str_replace('[...]', $link, $content);
}


Зміна довжини цитати

Визначає, скільки слів має бути в цитаті, яка зазвичай виводиться на архівних сторінках записів (рубрики, мітки). Цитату виводить функція the_excerpt() .

## Зміна довжини цитати
add_filter( 'excerpt_length', 'custom_excerpt_length_func');
function custom_excerpt_length_func( $length ) {
	return 20; // Кількість слів
}


Видалення полів із профілю в адмінці: AIM, Yahoo IM, Jabber

## видаляє з профілю поля: AIM, Yahoo IM, Jabber / Google Talk
add_filter('user_contactmethods', 'remove_contactmethod');
function remove_contactmethod( $contactmethods ) {
	unset($contactmethods['aim']);
	unset($contactmethods['jabber']);
	unset($contactmethods['yim']);

	return $contactmethods;
}


Додавання полів у профіль в адмінці: facebook, twitter

## Додає до профілю поля: AIM, Yahoo IM, Jabber / Google Talk
add_filter('user_contactmethods', 'add_contactmethod');
function add_contactmethod( $contactmethods ) {
	$contactmethods['twitter'] = 'Twitter';
	$contactmethods['facebook'] = 'Facebook';

	return $contactmethods;
}


Додавання класу has_sidebar до тега <body> , якщо є сайдбар

Для того, щоб цей хак працював, потрібно щоб у темі в тезі <body> використовувався, як заведено, тег шаблону body_class() .

## Додавання класу `has_sidebar` до тега `<body>`, якщо є сайдбар
add_filter('body_class', 'has_sidebar_func');
function has_sidebar_func( $classes ){
	if( is_active_sidebar('sidebar') ){
		// додаємо клас
		$classes[] = 'has_sidebar';
	}

	return $classes;
}


Додавання віджету в консоль

Іноді може стати в нагоді додати віджет в консоль адмін-панелі, щоб у ньому розмістити важливу інформацію щодо поточної теми.

## Довільний віджет у консолі в адмін-панелі
add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');
function my_custom_dashboard_widgets() {
	wp_add_dashboard_widget('custom_help_widget', 'Нотатки теми', 'custom_dashboard_help');
}

function custom_dashboard_help() {
	echo '<p>Ласкаво просимо до теми "Моя тема"! Тут деякі нотатки на тему.';
}

Отримаємо такий віджет:

zametki-temy


Увімкнення скрипту відповіді на коментар

Цей скрипт пересуває форму коментарів, натиснувши кнопку “Відповісти”.

## Підключення скрипту відповіді на коментар
add_action('wp_footer', 'enable_threaded_comments');
function enable_threaded_comments(){
	if( is_singular() && comments_open() && get_option('thread_comments') )
		wp_enqueue_script('comment-reply');
}


Зображення


Увімкнення мініатюр запису

За замовчуванням для записів немає блоку, де можна встановити мініатюру запису. Щоб такий блок з’явився, його потрібно увімкнути. Потрібно увімкнути підтримку мініатюр. Робиться це дуже просто:

## Увімкнення мініатюр запису
add_theme_support( 'post-thumbnails');
set_post_thumbnail_size(200, 200, true); // Normal post thumbnails

Як потім отримувати ці мініатюри та інші установки дивіться в add_theme_support()#post-thumbnails


Створення додаткових проміжних розмірів мініатюр

При завантаженні зображення для неї створюються додаткові розміри мініатюри. До базових розмірів можна легко додати свої – довільні.

## Створення проміжних розмірів мініатюр
if( function_exists('add_image_size') ){
	add_image_size('mysize-horizont', 300, 200, true);
	add_image_size('mysize-vertical', 400, 500, true);
}

Щоб отримати зареєстрований розмір, скористайтеся функцією:

<?php the_post_thumbnail('custombig'); ?>

Докладніше про створення розмірів мініатюр читайте в описі функції add_image_size()


Додавання мініатюри до RSS фід

Цей код додає мініатюру запису на початок RSS-фіду.

## Додавання мініатюри до RSS фід
add_filter( 'the_excerpt_rss', 'add_thumbnail_to_feed');
//add_filter( 'the_content_feed', 'add_thumbnail_to_feed'); // Зазвичай цей хук не використовується, але також може бути...
function add_thumbnail_to_feed( $content ){
	$img = get_the_post_thumbnail( null, array(100, 80), array( 'align' => 'left', 'style' => 'margin-right:15px;' ) );
	$content = $img. $content;

	return $content;
}

Докладніше читайте тут .


Скасовуємо обгортку картинок у тег <p> у контенті

При виведенні контенту в темі за допомогою wpautop() і в результаті якщо <img> знаходиться на окремому рядку, він обертається <p> . Тобто. було <img …> стало <p><img …></p> .

Цей приклад показує, як прибрати таку дивну поведінку.

## Скасуємо обгортку картинок у тег `<p>` у контенті
add_filter('the_content', 'remove_img_ptags_func');
function remove_img_ptags_func( $content ){
	return preg_replace('/<p>s*((?:<a[^>]+>)?s*<img[^>]+>s*(?:</a>)?) s*</p>/i', '1', $content);
}


Продуктивність


Підключення jQuery з Google

Підключати jQuery із Google найчастіше прискорює швидкість завантаження файлу. Докладніше про це читайте в окремій статті .

## Змінює URL розташування jQuery файлу тільки для фронт-енду
if( ! is_admin() ){
	add_action('wp_enqueue_scripts', 'jquery_enqueue_func', 11);
	function jquery_enqueue_func(){
		wp_deregister_script('jquery');
		wp_register_script('jquery', "http" . ($_SERVER['SERVER_PORT'] == 443 ? "s" : "") . ":ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery. min.js", false, null);
		wp_enqueue_script('jquery');
	}
}


Підключення скрипта html5 для IE6-IE8 з CDN

Цей скрипт потрібен, щоб старі браузери правильно розпізнавали теги HTML5 на кшталт <arcticle> , <aside> і т.д. Скрипт буде підключено лише якщо використовується IE 8 або нижче.

// Підключення скрипта html5 для IE з cdn
add_action('wp_head', 'IEhtml5_shim_func');
function IEhtml5_shim_func(){
	echo '<!--[if lt IE 9]><script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script><![ endif]-->';
	// або якщо потрібна ще й підтримка під час друку
	// echo '<!--[if lt IE 9]><script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script ><![endif]-->';
}


Встановимо максимальну кількість ревізій запису

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

Ідеально – обмежити кількість ревізій, наприклад до 5:

if( ! defined( 'WP_POST_REVISIONS' ) ){
	define( 'WP_POST_REVISIONS', 5);
}

Визначати константу треба у плагіні чи раніше.

Докладніше про ревізії читайте у описі функції wp_revisions_to_keep() .


Захист


Видалення версії WP

Потрібно це, щоб хакери не знали версію WP і не могли визначити слабкі місця. Разом із цим кодом потрібно також видалити файл readme.html у корені сайту, тому що в ньому також вказується поточна версія.

## Повне Видалення версії WP
## Також потрібно видалити файл readme.html у корені сайту
remove_action('wp_head', 'wp_generator'); // із заголовка
add_filter('the_generator', '__return_empty_string'); // з фідів та URL

Докладніше цю тему розписано тут .


Відключимо виводи помилок на сторінці авторизації

У разі помилки, при введенні логіна або пароля, WP повідомляє, що саме було введено неправильно: логін або пароль. Це дає додаткову інформацію для «підбирачів» паролів.

// Відключимо виводь помилок на сторінці авторизації
add_filter('login_errors', 'login_obscure_func');
function login_obscure_func(){
	return 'Помилка: ви ввели неправильний логін або пароль.';
}


Відключимо можливість правити файли в адмінці для тем і плагінів

Можливість редагувати файли прямо з адмінки може стати великою діркою у захисті. Давайте її закриємо.

## Відключимо можливість редагувати файли в адмінці для тем, плагінів
define('DISALLOW_FILE_EDIT', true);


Закриємо публікацію через xmlrpc.php

За замовчуванням увімкнено можливість публікації записів через файл xmlrpc.php .

Це така можливість публікувати записи з-за, наприклад з пошти… Найчастіше цей функціонал не потрібен і в ньому можуть бути потенційні дірки. Тому його найчастіше бажано відключити. До речі, в ранніх версіях WordPress цей функціонал був вимкнений за умовчанням і його потрібно було включити, щоб ним користуватися.

## закриємо можливість публікації через xmlrpc.php
add_filter('xmlrpc_enabled', '__return_false');

Джерела: wpfunction.me , wp-kama.ru

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *