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) ]; } // Тексты для редактора, тип записи 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>Добро пожаловать в тему "Моя тема"! Тут некоторые заметки по теме.'; }
Получим такой виджет:
Включение скрипта ответа на комментарий
Этот скрипт передвигает форму комментариев при нажатии на кнопку "Ответить".
## Подключение скрипта ответа на комментарий 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_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