Недавно на WPBeginner мне попалась очень интересная подборка полезных функций для Вордпресс, с которой я и хочу сегодня поделиться.
Напомню, файл functions.php в Вордпресс служит для размещения в нём пользовательских функций, которые можно вызывать в любом месте сайта. Этот файл расположен в директории активной темы. Добраться до него можно по FTP или с помощью редактора тем из админки Вордпресс.
Существенным недостатком размещения функций в functions.php является то, что при смене темы весь кастомный функционал пропадёт.
Поэтому, если разрабатывается независимый от темы функционал, правильнее создать плагин и разместить весь дополнительный код в нём. Подробнее об этом можно прочесть в статье «Почему лучше использовать плагины вместо functions.php».
Содержание
- Удаляем версию Вордпресс
- Свой логотип в админке Вордпресс
- Меняем подвал админки Вордпресс
- Добавляем свои виджеты в консоль Вордпресс
- Меняем дефолтный граватар на свой
- Динамический копирайт в Вордпресс
- Рандомный бэкграунд
- Обновляем адрес Вордпресс
- Добавляем дополнительный размер изображений
- Добавляем новое меню в Вордпресс
- Добавляем дополнительные поля авторам в Вордпресс
- Делаем поддержку виджетов в сайдбаре Вордпресс
- Добавляем кастомный футер в РСС-фид
- Добавляем изображение в РСС-фид
- Скрываем ошибки авторизации в Вордпресс
- Отключаем авторизацию по e-mail
- Отключаем поиск по сайту
- Отложенная публикация в РСС
- Меняем «Читать далее» в анонсах на свой текст
- Отключаем РСС в Вордпресс
- Меняем длину анонсов в Вордпресс
- Добавляем нового админа Вордпресс
- Удаляем панель приветствия в консоли Вордпресс
- Выводим количество зарегистрированных пользователей
- Исключаем некоторые рубрики из РСС-фида
- Разрешаем исполнение шорткодов в текстовом виджете Вордпресс
- Чередующиеся классы записей в циклах
- Разрешаем загрузку дополнительных типов файлов
- Удаляем ссылки загружаемых изображений
- Добавляем блок автора в посты
- Отключаем XML-RPC
- Ссылка на пост у миниатюры записи
- В заключение
Удаляем версию Вордпресс
Часто в целях безопасности бывает необходимо скрыть версию Вордпресс, делается это следующим образом.
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="<style>" title="<style>" />'; } //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 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.
Подробнее
Завис на сайте на старой версии WP(на новой кое-что не работает), поэтому есть необходимость скрыть от глаз версию. В статье описан классический вариант, повторяющийся в инете многократно. Есть менее популярные, к примеру, через wp_head: remove_action( ‘wp_head’, ‘wp_generator’ );.
Перепробовал все! Ни один не скрывает! Какой-то не убиваемый у меня «generator». Не подскажите на любой версии WP это работает или что-то мешает?
remove_action(‘wp_head’, ‘wp_generator’) работал еще на самых древних версиях ВП
Попробуйте проделать процедуры на дефолтной теме, а потом вернитесь к своей
А лучше обновиться, потому что при желании версию все таки узнать не сложно