трюки с файлом functions.php - Авторские материалы о продвижении вконтакте, wordpress фишках и плагинах, SMO, SEO, дизайне
Отборная информация, которая вставляет!

Трюки c functions.php которые вы не знали

Functions.php — это замечательная идея для тем wordpress. Это такой файлик, в который вы можете помещать специальные функции, которые будут работать только, если будет использована тема в которой этот файлик лежит.

Как человек, который разработал уже не один десяток сайтов на wordpress, в том числе и довольно сложные порталы, могу сказать, что сейчас невозможно сделать что-то интересное на worpdress без использования файла functions.php. У меня уже давно есть специальный набор нужных функций, и давно хотел с ними поделиться, как тут прочитал хорошую статью на одном западном сайте, где человек проделал уже такую работу и собрал ещё больше разных полезных функций для functions.php, поэтому ничего не остается как перевести эту статью и объяснить что к чему.

Первое что нужно знать, это то, что файл должен начинаться на — все остальное нужно вставлять внутрь.

А теперь, поехали

1. Удаляем вывод версии wordpress.


9643e5d7

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

// remove version info from head and feeds
function complete_version_removal() {
	return '';
}
add_filter('the_generator', 'complete_version_removal');

2. Добавить свой логотип в админпанель.

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

//hook the administrative header output
    add_action('admin_head', 'my_custom_logo');

    function my_custom_logo() {
    echo '
    <style type="text/css">
    #header-logo { background-image: url('.get_bloginfo('template_directory').'/images/custom-logo.gif) !important; }
    </style>
    ';
    } 

Ну и понятное дело в папку images вашей темы ложим логотип custom-logo.gif

3. Меняем ссылки в футере админки

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

   function remove_footer_admin () {
    echo 'Fueled by <a href="http://www.wordpress.org" target="_blank">WordPress</a> | Designed by <a href="http://www.uzzz.net" target="_blank">Uzzz Productions</a> | WordPress Tutorials: <a href="http://www.wpbeginner.com" target="_blank">WPBeginner</a></p>';
    }

    add_filter('admin_footer_text', 'remove_footer_admin');

4. Добавляем произвольный виджет на доску объявлений в админке.

И последний трюк с админкой, к примеру вам нужно создать виджет, который бы давал ваши контакты прямо на главной странице админпанели. Тогда нужно

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 '<p>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></p>';
    }

В данном случае появится вот что

5. Изменить дефолтные граватарки на сайте.

Иногда надоедают стандартные граватары, хотите, чтобы сайт был более интересным, сделайте свою картинку и вставьте ее следующим кодом

    add_filter( 'avatar_defaults', 'newgravatar' );

    function newgravatar ($avatar_defaults) {
    $myavatar = get_bloginfo('template_directory') . '/images/gravatar.gif';
    $avatar_defaults[$myavatar] = "WPBeginner";
    return $avatar_defaults;
    }

На странице выбора стандартных граватарок появится ещё одна, ваша, которую вы сможете выбрать как дефолтную.

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

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

    add_filter( 'the_author', 'guest_author_name' );
    add_filter( 'get_the_author_display_name', 'guest_author_name' );

    function guest_author_name( $name ) {
    global $post;

    $author = get_post_meta( $post->ID, 'guest-author', true );

    if ( $author )
    $name = $author;

    return $name;
    }

теперь вы можете добавлять имя автора через произвольное поле guest-author, значением которого и будет имя автора

7. включить поддержку миниатюр.

с версии 2.9, движок поддерживает создание миниатюр. Для этого в файле functions.php нужно вбить одну строку

add_theme_support( 'post-thumbnails' );

Частично о миниатюрах я писал в пункте 5 статьи о 2.9 версии

8. включить поддержку функции меню

С версии 3.0 wordpress имеет возможность настраивать порядок, сортировку, вложения и т.д. меню. Но для этого нужно вставить код

add_theme_support( 'menus' );

А меню нужно будет выводить в нужном месте с помощью кода

<?php wp_nav_menu( array( 'sort_column' => 'menu_order', 'container_class' => 'menu-header' ) ); ?>

9. Удаляем или добавляем необязательные поля при регистрации

После регистрации, в профиле юзера будут видны такие поля как aim, jabber, но часто они нам не нужны. Чтобы их удалить, пишем

    add_filter('user_contactmethods','hide_profile_fields',10,1);

    function hide_profile_fields( $contactmethods ) {
    unset($contactmethods['aim']);
    unset($contactmethods['jabber']);
    unset($contactmethods['yim']);
    return $contactmethods;
    }

А чтобы добавить нужное, создаем такой код

    function my_new_contactmethods( $contactmethods ) {
    // Add Twitter
    $contactmethods['twitter'] = 'Twitter';
    //add Facebook
    $contactmethods['facebook'] = 'Facebook';

    return $contactmethods;
    }
    add_filter('user_contactmethods','my_new_contactmethods',10,1);

Последний кусок кода добавит в профиль поля фейсбука и твиттера

Чтобы использовать теперь то или инное поле, вставляем в шаблон

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


Действует только для версии от 2.9 и выше.

10. Регистрируем виджеты.

ну это есть почти в любой теме, но напомню ещё раз.

if ( function_exists('register_sidebar') )
register_sidebar(array('name'=>'MiddleSidebar',
'before_widget' => '<li class="widget">',
'after_widget' => '</li>',
'before_title' => '<h2 class="widgettitle">',
'after_title' => '</h3>',
));

а в шаблон нужно вставить

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

    <?php endif; ?>

11. вставляем копирайты в футер

function wpbeginner_postrss($content) {
if(is_feed()){
$content = 'Этот пост написан автором ETNO '.$content.'Посетите сайт http://trend-bag.ru';
}
return $content;
}
add_filter('the_excerpt_rss', 'wpbeginner_postrss');
add_filter('the_content', 'wpbeginner_postrss');

Этот код вставляет определенный текст в rss канал

12. вставляем миниатюры в рсс канал

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

13.подключаем вложенные комментарии


// enable threaded comments
function enable_threaded_comments(){
if (!is_admin()) {
if (is_singular() AND comments_open() AND (get_option('thread_comments') == 1))
wp_enqueue_script('comment-reply');
}
}
add_action('get_header', 'enable_threaded_comments');

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

14. создаем шорткод adsense.

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

function showads() {
    return '<div id="adsense"><script type="text/javascript"><!–
    google_ad_client = "pub-XXXXXXXXXXXXXX";
    google_ad_slot = "4668915978";
    google_ad_width = 468;
    google_ad_height = 60;
    //–>
    </script>

    <script type="text/javascript"
    src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
    </script></div>';
    }

    add_shortcode('adsense', 'showads');

где вместо XXXXXXXXX — пишем свой номер. Теперь, добавив код [adsense] внутрь поста он будет автоматически заменяться на код адсенса при опубликовании.

15. редирект на feedburner без помощи плагинов и .htaccess

    function custom_feed_link($output, $feed) {

    $feed_url = 'http://feeds.feedburner.com/wpbeginner';

    $feed_array = array('rss' => $feed_url, 'rss2' => $feed_url, 'atom' => $feed_url, 'rdf' => $feed_url, 'comments_rss2' => '');
    $feed_array[$feed] = $feed_url;
    $output = $feed_array[$feed];

    return $output;
    }

    function other_feed_links($link) {

    $link = 'http://feeds.feedburner.com/wpbeginner';
    return $link;

    }
    //Add our functions to the specific filters
    add_filter('feed_link','custom_feed_link', 1, 2);
    add_filter('category_feed_link', 'other_feed_links');
    add_filter('author_feed_link', 'other_feed_links');
    add_filter('tag_feed_link','other_feed_links');
    add_filter('search_feed_link','other_feed_links');

16. отложенное обновление rss ленты.

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

// delay feed update
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 = '5'; // здесь пишем сколько нужно времени

		// 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');

17. кастомизируем окончание выдержки.

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

    // custom excerpt ellipses for 2.9
    function custom_excerpt_more($more) {
    return '…';
    }
    add_filter('excerpt_more', 'custom_excerpt_more');

    /* custom excerpt ellipses for 2.8-
    function custom_excerpt_more($excerpt) {
    return str_replace('[...]', '…', $excerpt);
    }
    add_filter('wp_trim_excerpt', 'custom_excerpt_more');
    */

18. кастомизируем длину выдержки

По умолчанию длина 55 слов, этим кодом можно сделать 100

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

19. отключить рсс фид вообще

иногда это тоже нужно, например, на корпоративных сайтах

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);

20. удаляем ненужные ссылки с wp_head.

По умолчанию там много всего выводится, и часто то, что не нужно. Отключаем таким кодом

// remove junk from head
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'index_rel_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'start_post_rel_link', 10, 0);
remove_action('wp_head', 'parent_post_rel_link', 10, 0);
remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0);

21. подключаем библиотеку jquery с гугла, а не с нашего сервера

а зачем нагружать свой сайт лишними скриптами, если их можно грузить с гугла

// smart jquery inclusion
if (!is_admin()) {
	wp_deregister_script('jquery');
	wp_register_script('jquery', ("http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"), false);
	wp_enqueue_script('jquery');
}

22. проверяем нагрузку сайта

function sys_stat() { 
	printf(('System statistic : %d queries / %s seconds'), get_num_queries(), timer_stop(0, 3));
	if ( function_exists('memory_get_usage') ) echo ' / ' . round(memory_get_usage()/1024/1024, 2) . ' mb'; 
}

теперь где-то в футер вставляем

<?php sys_stat(); ?>

и узнаем кол-во запросов к базе и скорость.

Мониторинг сети: Недавно нашел интересный сайт с секретами на все случаи жизни. От спорта до отношений, все это читайте на этом сайте


 

Похожие статьи:



21 комментариев к “Трюки c functions.php которые вы не знали”

  1. :

    {Хорошая подборка, спасибо, пару вариантов опробую на себе.

  2. :

    Серьёзный мануал.
    Спасибо за уйму полезной информации. Как раз пришло время довести тему до ума и эти рекомендации будут весьма кстати.

  3. VRS:

    Спасибо, нашла много полезного для себя…Может быть Вы еще подскажете как отключить выбор цветовых схем у простого подписчика?

    • ETNO:

      не совсем понял что вы хотите.

      • VRS:

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

        • ETNO:

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

        • VRS:

          Я делаю магазин на базе WP для подруги. На мой взгляд, чем меньше простому подписчику даны опций тем лучше.

          Вот мое решение для WP 2.9.2 (скрыла еще и футер, т.к. там выводилась версия и наименование одного из плагинов):

          <?php if (!current_user_can('level_10')) {
          function remove_menu() {
          global $menu;
          //remove post top level menu
          unset($menu[0]);
          unset($menu[75]);
          }
          add_action('admin_head', 'remove_menu');

          function sk_admin_css() { // удаляем подвал и выбор цветовых схем у не администратора
          print '#footer { display:none; } .form-table fieldset { display:none; }’;
          }
          add_action (‘admin_head’, ‘sk_admin_css’);

          function my_admin_help($screen) { // замена текста «помощи» на свой
          global $screen;
          unset($screen[0]);
          $text = ‘По всем вопросам обращаться к разработчику сайта’;
          return $text;

          }
          add_action( ‘contextual_help’, ‘my_admin_help’ );

          }
          ?>

  4. ETNO:

    спасибо, пригодится

  5. :

    добрый день, может подскажите простой способ добавить свой виджет в админку, его цель должна быть одна, вставить код:

    • ETNO:

      не знаю насколько понял то, что вам нужно — но по-моему, вам подойдет плагин ушки —

      • :

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

        • ETNO:

          комменты код порезали. немного неясно — нужно добавить такой виджет в админке, в котором можно прописать php код, который работал бы на сайте на месте виджета?

  6. :

    Да именно так, вы все правильно поняли. Я добавил в functions.php функцию подсчета просмотров страниц, а вставить код в виджет зону не могу, больно мудренная или руки у меня не от туда растут.) Устанавливал пару плагинов для вывода пхп через виджет, не срабатывает.(

    • ETNO:

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

      • :

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

        • ETNO:

          так а если вы хотите через изменения в шаблоне, то почему просто не вставить функцию в шаблоне в сайдбар или есть какие-то трудности?

          • :

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

          • ETNO:

            слайдер на jquery — а есть где глянуть?

  7. :

    ну вообще то слайдер в футере, ссылка в инфо,просто он не активен, потому что мало виджетов добавлено. Ничего сверх оригинального, блок контейнер, в нем добавлено 4 виджет зоны.

    • ETNO:

      ну так сложно сказать в чем проблема, но я думаю тогда проще поставить или плагин или попробовать все-таки правильно вставить код в слайдер

  8. :

    Весьма полезная информация, особенно пригодилось отложенное обновление RSS ленты. Пошел править на своих блогах. Спасибо за информацию!