WordPress как на ладони
wordpress jino

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://wptest.ru/feed/" />
<link rel="alternate" type="application/rss+xml" title="Мой сайт / Comments Feed" href="http://wptest.ru/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) ];
	}
	// Тексты для редактора, тип записи page
	else {
		$array = array(
			'Какое-то сообщение',
			'<h1>Какое-то сообщение</h1>',
		);

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

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

И еще статья по этой теме: Заранее установленный текст для нового поста

Изменение количество записей на странице поиска

По умолчанию на странице поиска показывается столько же записей на странице сколько и везде, сколько выставлено в настройках.

Этот пример показывает как вывести 100 записей на странице.

## change amount of posts on the 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> в контенте

При выводе контента в теме с помощью the_content(), срабатывает функция 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

Нужно это для того, чтобы хакеры не знали версию 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

25+ хуков functions.php для темы 21 комментарий
Полезные 1 Все
  • Otshelnik-Fm185 cайт: otshelnik-fm.ru

    Мои 5 копеек:

    // если в поиске найден только один ответ - то на полный пост. start
    add_action('template_redirect', 'single_result');  
    function single_result() {  
    	if (is_search()) {  
    		global $wp_query;  
    		if ($wp_query->post_count == 1) {  
    			wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );  
    		}  
    	}  
    }
    // если в поиске найден только один ответ - то на полный пост. end
    // удалить из профиля
    function add_twitter_contactmethod( $contactmethods ) {
      unset($contactmethods['aim']);
      unset($contactmethods['jabber']);
      unset($contactmethods['yim']);
      return $contactmethods;
    }
    add_filter('user_contactmethods','add_twitter_contactmethod',10,1);
    // end удалить из профиля
    // закроем брутфорс через xmlrpc.php
    add_filter('xmlrpc_enabled', '__return_false');
    3
    Ответитьгод назад #
    • Kama4696

      Спасибо, сейчас добавилю thank_you

      Ответитьгод назад #
      • Otshelnik-Fm185 cайт: otshelnik-fm.ru

        1й сниппет не добавил. Он работает так: Если в результате поиска найдена только 1 запись - то он переходит сразу к ней.

        Думаю еще в "Статьи до этого" надо добавить 10+ приемов с админкой WordPress (сайт для клиента) http://wp-kama.ru/id_916/10-manipulyatsiy-nad-adminkoy-wordpress-sayt-dlya-klienta.html - там тоже много полезностей собрали

        Ответитьгод назад #
        • Kama4696

          Специально не добавил, пусть в комментах пока. Он по теме немного не подходит...

          Я аналогичную статью напишу еще, там штук 30 снипетов полезных соберу, но уже, не непосредственно по теме (шаблону). А просто полезных, и не частых, не обязательных, для юзабилити и т.д. Вот туда как раз этот твой первый сниппет попадет...

          А ссылку на 10 приемов админки, сейчас добавилю... Спасибо! thank_you

          Ответитьгод назад #
          • Otshelnik-Fm185 cайт: otshelnik-fm.ru

            Ок.
            offtop: Заметил странность - показано что подписка на комментарии к этой статье есть, а на почту я твои два ответа так и не получил.

            Ответитьгод назад #
            • Kama4696

              Видимо плагин барахлит. Чуть что проверю этот момент, спасибо! thank_you

              Ответитьгод назад #
  • Larker cайт: jusup.top

    ***`

    Спасибо

    `*** smile

    1
    Ответитьгод назад #
  • Может кому пригодится. Отмена автоизменений редактором. Текст сохранится как есть.

    function no_wpautop_single($content) { /** отмена для редактора */
    	global $post;
    	if (is_single(array(5136,3820))){
    		remove_filter( 'the_content', 'wpautop' );
    		return $content;
    	} else {
    		return $content;
    	}
    }
    add_filter('the_content', 'no_wpautop_single', 9);

    Если нужно для отдельных страниц, указываем номер поста в массив.

    if (is_single(array(5136,3820)))
    Ответитьгод назад #
    • Kama4696

      Это отмена форматирования переносов строк... Что еще за автоизменение? В каких случаях это может быть нужно? wacko

      Ответитьгод назад #
      • Например строк для SVG:

        <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="578" height="213">
        <image x="5" y="0" xlink:href="" width="284" height="213"/>
        <rect x="368" y="50" width="142" height="106.5" fill="none" stroke="black"/>
        <ellipse cx="441" cy="101.5" rx="56.8" ry="42.6" fill="black" filter="url(#filter2)"/></svg>

        Это альтернатива этой функции:

        function my_formatter($content) {
        $new_content = '';
        $pattern_full = '{(\[raw\].*?\[/raw\])}is';
        $pattern_contents = '{\[raw\](.*?)\[/raw\]}is';
        $pieces = preg_split($pattern_full, $content, -1, PREG_SPLIT_DELIM_CAPTURE);
        foreach ($pieces as $piece) {
        if (preg_match($pattern_contents, $piece, $matches)) {
        $new_content .= $matches[1];
        } else {
        $new_content .= wptexturize(wpautop($piece));
        }
        }
        return $new_content;
        }
        remove_filter('the_content', 'wpautop');
        remove_filter('the_content', 'wptexturize');
        add_filter('the_content', 'my_formatter', 99);
        Ответитьгод назад #
        • Kama4696

          Тут можно только wptexturize отменить. Она в целом не нужна. И можно убрать эту лишнюю функцию...

          remove_filter('the_content', 'wptexturize');

          wpautop вроде не должен мешать...

          Ответитьгод назад #
  • Раздел http://wp-kama.ru/id_7584/25-hukov-functions-php-dlya-temy.html/comment-page-1#dobavlenie-polej-v-profil-v-adminke-facebook-twitter

    Там надо написать:

    ## Добавление полей в профиль в админке: facebook, twitter

    1
    Ответитьгод назад #
    • Kama4696

      Ниче не понял... wacko

      Ответитьгод назад #
      • Этот код не удаляет, а добавляет!

        ## удаляет из профиля поля: AIM, Yahoo IM, Jabber / Google Talk
        add_filter('user_contactmethods', 'add_contactmethod');
        function add_contactmethod( $contactmethods ) {
        	$contactmethods['twitter'] = 'Twitter';
        	$contactmethods['facebook'] = 'Facebook';
        
        	return $contactmethods;
        }
        2
        Ответитьгод назад #
  • Денис cайт: webliberty.ru

    Добрый вечер!

    Уточнение про скрипт HTML5 для IE:

    http://html5shim.googlecode.com/svn/trunk/html5.js

    404 ошибка. На Гитхате есть исходники. Можно скачать и загрузить на свой сервер, а затем подключить.

    1
    Ответитьгод назад #
    • Kama4696

      Обновил ссылку на https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js

      Спасибо за коммент! thank_you

      Ответитьгод назад #
  • Приветствую Вас!
    В разделе Отменяем обертку картинок в тег p в контенте допущена ошибка в регулярном выражении. Исходный вариант не работает:

    preg_replace('/<p>\s*(<a[^>]+>)?\s*(<img[^>]+>)\s*(a>)?\s*<\/p>/iU', '\1\2\3', $content);
    

    В третьей скобочной группе не дописан закрывающий тег а и также лишним оказался флаг U. И еще, нет смысла плодить столько сохраняющих групп, достаточно будет одной. Предлагаю альтернативное выражение:

    preg_replace('`<p>\s*((?:<a[^>]+>)?\s*<img[^>]+>\s*(?:</a>)?)\s*</p>`i', '\1', $content);
    3
    • Kama4696

      Спасибо за багрепорт проверил - точно ошибка! Обновил статью. thank_you

Здравствуйте, !

Ваш комментарий
Предпросмотр