32 трюка с файлом функций Вордпресс

Недавно на WPBeginner мне попалась очень интересная подборка полезных функций для Вордпресс, с которой я и хочу сегодня поделиться.

Напомню, файл functions.php в Вордпресс служит для размещения в нём пользовательских функций, которые можно вызывать в любом месте сайта. Этот файл расположен в директории активной темы. Добраться до него можно по FTP или с помощью редактора тем из админки Вордпресс.

Существенным недостатком размещения функций в functions.php является то, что при смене темы весь кастомный функционал пропадёт.

Поэтому, если разрабатывается независимый от темы функционал, правильнее создать плагин и разместить весь дополнительный код в нём. Подробнее об этом можно прочесть в статье «Почему лучше использовать плагины вместо functions.php».

Содержание

Удаляем версию Вордпресс

Часто в целях безопасности бывает необходимо скрыть версию Вордпресс, делается это следующим образом.

function wpb_remove_version() {
return '';
}
add_filter('the_generator', 'wpb_remove_version');

Свой логотип в админке Вордпресс

Если вы собрались персонифицировать админку Вордпресс, можно начать с добавления вашего логотипа в админбар.

function wpb_custom_logo() {
echo '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%23wpadminbar%20%23wp-admin-bar-wp-logo%20%3E%20.ab-item%20.ab-icon%3Abefore%20%7B%0Abackground-image%3A%20url('%20.%20get_bloginfo('stylesheet_directory')%20.%20'%2Fimages%2Fcustom-logo.png)%20!important%3B%0Abackground-position%3A%200%200%3B%0Acolor%3Argba(0%2C%200%2C%200%2C%200)%3B%0A%7D%0A%23wpadminbar%20%23wp-admin-bar-wp-logo.hover%20%3E%20.ab-item%20.ab-icon%20%7B%0Abackground-position%3A%200%200%3B%0A%7D%0A%3C%2Fstyle%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;style&gt;" title="&lt;style&gt;" />';
}
//hook into the administrative header output
add_action('wp_before_admin_bar_render', 'wpb_custom_logo');

Меняем подвал админки Вордпресс

В подвале админки Вордпресс обычно красуется надпись «Спасибо вам за творчество с WordPress», её можно убрать или заменить на свой текст.

function remove_footer_admin () {
echo 'Fueled by <a href="http://www.wordpress.org" target="_blank">WordPress</a> | WordPress Tutorials: <a href="http://www.wpbeginner.com" target="_blank">WPBeginner</a>';
}
add_filter('admin_footer_text', 'remove_footer_admin');

Добавляем свои виджеты в консоль Вордпресс

Наверняка вы видели как некоторые плагины выводят свои виджеты прямо в консоли Вордпресс. Делается это очень просто.

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');
function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
wp_add_dashboard_widget('custom_help_widget', 'Theme Support', 'custom_dashboard_help');
}
function custom_dashboard_help() {
echo 'Welcome to Custom Blog Theme! Need help? Contact the developer <a href="mailto:yourusername@gmail.com">here</a>. For WordPress Tutorials visit: <a href="http://www.wpbeginner.com" target="_blank">WPBeginner</a>';
}

Добавляем свои виджеты в консоль Вордпресс

Меняем дефолтный граватар на свой

Вордпресс в качестве граватара по умолчанию выводит логотип этого сервиса, но его можно заменить на свой.

add_filter( 'avatar_defaults', 'wpb_new_gravatar' );
function wpb_new_gravatar ($avatar_defaults) {
$myavatar = 'http://example.com/wp-content/uploads/2017/01/wpb-default-gravatar.png';
$avatar_defaults[$myavatar] = "Default Gravatar";
return $avatar_defaults;
}

Меняем дефолтный граватар на свой

Динамический копирайт в Вордпресс

Функция берёт даты первого и последнего поста блога и в соответствии с ними выводит копирайты в подвале.

function wpb_copyright() {
global $wpdb;
$copyright_dates = $wpdb->get_results("
SELECT
YEAR(min(post_date_gmt)) AS firstdate,
YEAR(max(post_date_gmt)) AS lastdate
FROM
$wpdb->posts
WHERE
post_status = 'publish'
");
$output = '';
if($copyright_dates) {
$copyright = "© " . $copyright_dates[0]->firstdate;
if($copyright_dates[0]->firstdate != $copyright_dates[0]->lastdate) {
$copyright .= '-' . $copyright_dates[0]->lastdate;
}
$output = $copyright;
}
return $output;
}

В теме выводится так:

<?php echo wpb_copyright(); ?>

Рандомный бэкграунд

Хотите чтобы цвет фона сайта после каждой загрузки страницы менялся случайным образом?

function wpb_bg() {
$rand = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
$color ='#'.$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)].
$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)];
echo $color;
}

В теме можно подключить к тегу body

<body <?php body_class(); ?> style="background-color:<?php wpb_bg();?>">>

Рандомный бэкграунд

Обновляем адрес Вордпресс

URL сайта обычно задаётся в wp-config.php, но после изменения может потеряться доступ в админку. Обновить адрес в настройках можно с помощью functions.php.

update_option( 'siteurl', 'http://example.com' );
update_option( 'home', 'http://example.com' );

После обновления не забудьте удалите код.

Добавляем дополнительный размер изображений

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

add_image_size( 'sidebar-thumb', 120, 120, true ); // Hard Crop Mode
add_image_size( 'homepage-thumb', 220, 180 ); // Soft Crop Mode
add_image_size( 'singlepost-thumb', 590, 9999 ); // Unlimited Height Mode

А в теме выводится так:

<?php the_post_thumbnail( 'homepage-thumb' ); ?>

Добавляем новое меню в Вордпресс

Одна из стандартных задач — ввести новое динамическое меню и вывести его в теме.

Регистрация меню:

function wpb_custom_new_menu() {
register_nav_menu('my-custom-menu',__( 'My Custom Menu' ));
}
add_action( 'init', 'wpb_custom_new_menu' );

Вывод в теме:

<?php wp_nav_menu( array( 'theme_location' => 'my-custom-menu',
'container_class' => 'custom-menu-class' ) );
?>

Добавляем дополнительные поля авторам в Вордпресс

Авторская анкета в Вордпресс очень примитивная, но её можно существенно расширить не прибегая к помощи сторонних плагинов.

function wpb_new_contactmethods( $contactmethods ) {
// Add Twitter
$contactmethods['twitter'] = 'Twitter';
//add Facebook
$contactmethods['facebook'] = 'Facebook';
return $contactmethods;
}
add_filter('user_contactmethods','wpb_new_contactmethods',10,1);

Вывод в теме

<?php echo $curauth->twitter; ?>

Добавляем дополнительные поля авторам в Вордпресс

Делаем поддержку виджетов в сайдбаре Вордпресс

Ещё одна стандартная для Вордпресс-девелоперов задача — регистрация сайдбара с поддержкой динамических виджетов и его вывод в коде темы.

Регистрация:

// Register Sidebars
function custom_sidebars() {
$args = array(
'id' => 'custom_sidebar',
'name' => __( 'Custom Widget Area', 'text_domain' ),
'description' => __( 'A custom widget area', 'text_domain' ),
'before_title' => '
<h3 class="widget-title">',
'after_title' => '</h3>',
'before_widget' => '
<aside id="%1$s" class="widget %2$s">',
'after_widget' => '</aside>',
);
register_sidebar( $args );
}
add_action( 'widgets_init', 'custom_sidebars' );

Вывод в теме:

<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('custom_sidebar') ) : ?>
<!–Default sidebar info goes here–>
<?php endif; ?>

Делаем поддержку виджетов в сайдбаре Вордпресс

Добавляем кастомный футер в РСС-фид

Вордпресс по умолчанию имеет только пару настроек фидов — вид публикации (анонс или пост целиком) и количество постов в фиде. Штатной кастомизации просто нет, а её часто не хватает.

function wpbeginner_postrss($content) {
if(is_feed()){
$content = 'This post was written by Syed Balkhi '.$content.'Check out WPBeginner';
}
return $content;
}
add_filter('the_excerpt_rss', 'wpbeginner_postrss');
add_filter('the_content', 'wpbeginner_postrss');

Добавляем изображение в РСС-фид

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

function rss_post_thumbnail($content) {
global $post;
if(has_post_thumbnail($post->ID)) {
$content = '' . get_the_post_thumbnail($post->ID) .'' . get_the_content();
}
return $content;
}
add_filter('the_excerpt_rss', 'rss_post_thumbnail');
add_filter('the_content_feed', 'rss_post_thumbnail');

Скрываем ошибки авторизации в Вордпресс

Совершенно ни к чему выводить эти ошибки если доступ в админку имеет узкий круг лиц, а то и вовсе один.

function no_wordpress_errors(){
return 'Something is wrong!';
}
add_filter( 'login_errors', 'no_wordpress_errors' );

Отключаем авторизацию по e-mail

Это удобно, но не всегда безопасно.

remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );

Отключаем поиск по сайту

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

function fb_filter_query( $query, $error = true ) {
if ( is_search() ) {
$query->is_search = false;
$query->query_vars[s] = false;
$query->query[s] = false;
// to error
if ( $error == true )
$query->is_404 = true;
}
}
add_action( 'parse_query', 'fb_filter_query' );
add_filter( 'get_search_form', create_function( '$a', "return null;" ) );

Отложенная публикация в РСС

Иногда после публикации статьи, в тексте обнаруживаются опечатки, ошибки. Исправить их на сайте не сложно. Но если осуществляется трансляция РСС, публикация уже могла разнестись по всему миру вместе с ошибками. Чтобы исключить такие ситуации, можно сделать небольшой тайм-аут между публикацией на сайте и трансляцией в РСС. 10 минут, например.

function publish_later_on_feed($where) {
global $wpdb;
if ( is_feed() ) {
// timestamp in WP-format
$now = gmdate('Y-m-d H:i:s');
// value for wait; + device
$wait = '10'; // integer
// http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timestampdiff
$device = 'MINUTE'; //MINUTE, HOUR, DAY, WEEK, MONTH, YEAR
// add SQL-sytax to default $where
$where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
}
return $where;
}
add_filter('posts_where', 'publish_later_on_feed');

Меняем «Читать далее» в анонсах на свой текст

Об этом не писал только ленивый, меняем и радуемся.

function modify_read_more_link() {
return '<a class="more-link" href="' . get_permalink() . '">Your Read More Link Text</a>';
}
add_filter( 'the_content_more_link', 'modify_read_more_link' );

Отключаем РСС в Вордпресс

Как и в случае с поиском, все неиспользуемое лучше отключить и забыть. Особенно это касается разных статичных сайтов, визиток.

function fb_disable_feed() {
wp_die( __('No feed available,please visit our <a href="'. get_bloginfo('url') .'">homepage</a>!') );
}
add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);

Меняем длину анонсов в Вордпресс

Почему-то одна из первоочередных задач многих начинающих блогеров — обязательно изменить дефолтные 55 знаков на какое-то своё заветное число.

function new_excerpt_length($length) {
return 100;
}
add_filter('excerpt_length', 'new_excerpt_length');

Добавляем нового админа Вордпресс

В жизни всякое бывает, возможно кому-то придётся создавать админа в Вордпресс с помощью functions.php. Главное — не забудьте потом удалить этот код.

function wpb_admin_account(){
$user = 'Username';
$pass = 'Password';
$email = 'email@domain.com';
if ( !username_exists( $user ) && !email_exists( $email ) ) {
$user_id = wp_create_user( $user, $pass, $email );
$user = new WP_User( $user_id );
$user->set_role( 'administrator' );
} }
add_action('init','wpb_admin_account');

Удаляем панель приветствия в консоли Вордпресс

Мне сложно представить зачем это нужно, но вдруг кому-то пригодится.

remove_action('welcome_panel', 'wp_welcome_panel');

Выводим количество зарегистрированных пользователей

Функция создаёт шорткод [user_count], с помощью которого можно выводить в любом месте сайта число зарегистрированных на сайте пользователей.

// Function to return user count
function wpb_user_count() {
$usercount = count_users();
$result = $usercount['total_users'];
return $result;
}
// Creating a shortcode to display user count
add_shortcode('user_count', 'wpb_user_count');

Исключаем некоторые рубрики из РСС-фида

Возможно, у вас там что-то личное, конфиденциальное, что должно оставаться только на сайте.

function exclude_category($query) {
if ( $query->is_feed ) {
$query->set('cat', '-5, -2, -3');
}
return $query;
}
add_filter('pre_get_posts', 'exclude_category');

Разрешаем исполнение шорткодов в текстовом виджете Вордпресс

По-умолчанию они не срабатывают, если вы не знали.

// Enable shortcodes in text widgets
add_filter('widget_text','do_shortcode');

Чередующиеся классы записей в циклах

Мне привычнее делать такие вещи на чистом CSS, но возможно кому-то понадобится более классический способ. Например, для поддержи старых браузеров, которые не понимают CSS3.

function oddeven_post_class ( $classes ) {
global $current_class;
$classes[] = $current_class;
$current_class = ($current_class == 'odd') ? 'even' : 'odd';
return $classes;
}
add_filter ( 'post_class' , 'oddeven_post_class' );
global $current_class;
$current_class = 'odd';

И тогда CSS можно сделать таким

.even {
background:#f0f8ff;
}
.odd {
background:#f4f4fb;
}

Разрешаем загрузку дополнительных типов файлов

В целях безопасности в Вордпресс по умолчанию разрешена загрузка очень ограниченного количества типов файлов, но ситуацию можно поправить. Например, чтобы разрешить загрузку PSD и SVG можно сделать так.

function my_myme_types($mime_types){
$mime_types['svg'] = 'image/svg+xml'; //Adding svg extension
$mime_types['psd'] = 'image/vnd.adobe.photoshop'; //Adding photoshop files
return $mime_types;
}
add_filter('upload_mimes', 'my_myme_types', 1, 1);

Удаляем ссылки загружаемых изображений

Всем загружаемым в редакторе изображениям Вордпресс по умолчанию ставит ссылку, и это можно отключить.

function wpb_imagelink_setup() {
$image_set = get_option( 'image_default_link_type' );
if ($image_set !== 'none') {
update_option('image_default_link_type', 'none');
}
}
add_action('admin_init', 'wpb_imagelink_setup', 10);

Добавляем блок автора в посты

Если в теме не предусмотрен вывод информации об авторе, это можно исправить.

function wpb_author_info_box( $content ) {
global $post;
// Detect if it is a single post with a post author
if ( is_single() && isset( $post->post_author ) ) {
// Get author's display name
$display_name = get_the_author_meta( 'display_name', $post->post_author );
// If display name is not available then use nickname as display name
if ( empty( $display_name ) )
$display_name = get_the_author_meta( 'nickname', $post->post_author );
// Get author's biographical information or description
$user_description = get_the_author_meta( 'user_description', $post->post_author );
// Get author's website URL
$user_website = get_the_author_meta('url', $post->post_author);
// Get link to the author archive page
$user_posts = get_author_posts_url( get_the_author_meta( 'ID' , $post->post_author));
if ( ! empty( $display_name ) )
$author_details = '
About ' . $display_name . '';
if ( ! empty( $user_description ) )
// Author avatar and bio
$author_details .= get_avatar( get_the_author_meta('user_email') , 90 ) . nl2br( $user_description );
$author_details .= '<a href="'. $user_posts .'">View all posts by ' . $display_name . '</a>';
// Check if author has a website in their profile
if ( ! empty( $user_website ) ) {
// Display author website link
$author_details .= ' | <a href="' . $user_website .'" target="_blank" rel="nofollow">Website</a>';
} else {
// if there is no author website then just close the paragraph
$author_details .= '';
}
// Pass all this info to post content
$content = $content . '
<footer class="author_bio_section" >' . $author_details . '</footer>';
}
return $content;
}
// Add our function to the post content filter
add_action( 'the_content', 'wpb_author_info_box' );
// Allow HTML in author bio section
remove_filter('pre_user_description', 'wp_filter_kses');

Стили.

.author_bio_section{
background: none repeat scroll 0 0 #F5F5F5;
padding: 15px;
border: 1px solid #ccc;
}
.author_name{
font-size:16px;
font-weight: bold;
}
.author_details img {
border: 1px solid #D8D8D8;
border-radius: 50%;
float: left;
margin: 0 10px 10px 0;
}

Отключаем XML-RPC

Это такой метод взаимодействия сторонних приложений с Вордпресс, абсолютно не нужный для большинства сайтов.

add_filter('xmlrpc_enabled', '__return_false');

Ссылка на пост у миниатюры записи

К миниатюрам можно прикрепить автоматическую ссылку на привязанный пост.

function wpb_autolink_featured_images( $html, $post_id, $post_image_id ) {
If (! is_singular()) {
$html = '<a href="' . get_permalink( $post_id ) . '" title="' . esc_attr( get_the_title( $post_id ) ) . '">' . $html . '</a>';
return $html;
} else {
return $html;
}
}
add_filter( 'post_thumbnail_html', 'wpb_autolink_featured_images', 10, 3 );

В заключение

⚡️ Присоединяйтесь к моему телеграм-каналу! Рассказываю о своих рабочих буднях на фрилансе и делюсь полезными материалами по веб‑разработке.

Как видим, с помощью таких вот манипуляций с functions.php можно существенно кастомизировать дефолтный функционал Вордпресс. И, что важно — не прибегая к помощи сторонних плагинов. Которые не всегда отличаются высокой оптимизацией и быстродействием.

Иван Данилин
Автор Иван Данилин

Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.

Подробнее
Комментарии
  1. Приветствую автора!
    Завис на сайте на старой версии WP(на новой кое-что не работает), поэтому есть необходимость скрыть от глаз версию. В статье описан классический вариант, повторяющийся в инете многократно. Есть менее популярные, к примеру, через wp_head: remove_action( ‘wp_head’, ‘wp_generator’ );.
    Перепробовал все! Ни один не скрывает! Какой-то не убиваемый у меня «generator». Не подскажите на любой версии WP это работает или что-то мешает?
    • Добрый день!
      remove_action(‘wp_head’, ‘wp_generator’) работал еще на самых древних версиях ВП
      Попробуйте проделать процедуры на дефолтной теме, а потом вернитесь к своей

      А лучше обновиться, потому что при желании версию все таки узнать не сложно
Добавить комментарий