Файл functions.php из папки с темой WordPress — реальные примеры его использования

20 Июль, 2013

Здравствуйте, уважаемые читатели блога KtoNaNovenkogo.ru. Сегодня хотел объединить в рамках одного поста все варианты использования файла functions.php, которые мне доводилось когда-либо пробовать и которые работают на моем блоге сейчас. Живет этот файл практически в папке каждой темы для Вордпресса, ну, а если его вы там не обнаружите, то не будет проблемой его создать.

Если вы используете достаточно продвинутую тему оформления, то в functions.php скорее всего будут прописаны различные возможности настроек ее внешнего вида и функционала. Сами эти настройки будут доступны из админки WordPress, и вам лазить в этой файл будет незачем. Но кроме всего прочего этот замечательный файлик может творить чудеса, часть из которых будет описана ниже.

Как вносить изменения в functions.php и все не поломать


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

Файл functions.php замечателен тем, что по аналогии с плагинами он подгружается при генерации страниц вашего блога (фронтэнда и админки тоже). Поэтому его и используют для прописывания различных функций, фильтров или прочих хаков, которые останутся работоспособными даже после обновления Вордпресса.

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

Очень неприятное занятие, доложу я вам. Понимать, что вы это уже когда-то сделали, но сейчас не в состоянии вспомнить как. Выбешивает это дело по страшному. А вот с functions.php все шоколадно.

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

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

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

Сегодняшняя же публикация станет ее логическим продолжением, ибо functions.php я там не рассматривал.

Если по каким-либо причинам в папке с вашей темой такого ценного объекта обнаружено не будет, то вам всего навсего нужно будет его там создать с помощью FileZilla, о которой я писал здесь. Открываете папку с темой:

wp-content/themes/название

и щелкаете в любом ее месте правой кнопкой мыши, после чего выбираете пункт «Создать новый файл» из контекстного меню:

Замечательно. Я не знаток языка PHP, но все функции, которые вы будете добавлять в этот файл, должны обрамляться конструкцией:

<?php
?>

Так же эти самые теги PHP могут стоять в самом начале и в самом конце всего содержимого. Тогда все функции внутри них нужно будет вставлять без указанного обрамления. Я их буду приводить именно в таком виде (разоблаченном). Понятно?

Ну, что поделать. Я и сам всех этих тонкостей не знаю (равно как и этот язык программирования), а просто чувствую по опыту. Поэтому, если хотите все по науке, то придется прочитать эту статью Уважаемого Камы.

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

Категорически не советую вносить изменения в functions.php через админку Вордпресса (Внешний вид — Редактор — Функции темы).

В этом случае у вас не будет возможности отката назад при неудачном эксперименте и не будет подсветки синтаксиса языка PHP, которая при должном навыке сразу же поможет вам понять, что вы делаете что-то не так. Таким способом работать можно, если только у вас по каким-либо загадочным причинам отсутствует доступ к сайту по ФТП.

Для редактирования очень желательно использовать специализированный или же универсальный редактор с подсветкой кода, например, Notepad++, о котором речь шла в этой статье. Замечательная вещь и к тому же бесплатная.

Так, еще не стоит пихать новые функции внутрь уже имеющихся (внутрь фигурных скобок {}). Если сумлеваетесь, то новый блок вставляйте в самом низу, но перед закрывающим PHP тегом:

?>

Однако, если код каждой функции вы отдельно обрамляете этими тегами, то очередной шедевр вставляйте после закрывающего тега последнего фрагмента. Понятно? Да мне и самому было бы не понятно с такого объяснения, но чего то сегодня я косноязычен (или как это сказать применительно к клавиатуре).

Как вставлять блоки РСЯ и Адсенс с помощью functions.php


Ну, понятно, что вставить блок с рекламой в любое место макета сайта можно будет с помощью шаблонов из папки с вашей темой оформления (single, index, arhive и других). Но как добавить блоки в текст самой статьи?

Например, после всех заголовков, как у меня, ибо после тега More, о котором мы говорили тут. Без functions.php нам в таком случае будет не обойтись.

Сразу оговорюсь про отличие вставки кода Google AdSense, описанного тут и кода блоков РСЯ, про которые речь шла здесь.

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

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

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

function testovoe_nazvanie() {
    return 'Полученный Вами код AdSense или РСЯ';
}
add_shortcode('adsense1', 'testovoe_nazvanie');

Теперича в нужном месте статьи блога на WordPress достаточно будет вставить обозначенную чуть ниже конструкцию, чтобы на ее месте ваши читатели могли лицезреть блок РСЯ или Адсенса:

[adsensе1] 

Хотите вставлять разные типы объявлений в разные статьи или их места? Создайте в functions.php еще одну такую же функцию, но используйте testovoe_nazvanie2 и adsense2. Все очень просто, но хлопотно, ибо вставлять в каждую статью короткий код утомительно. Нет проблем.

Для автоматической вставки блоков рекламы после внутренних заголовков в статье (у меня они обрамлены тегами H3) нужно дописать в наш замечательный файлик следующий код:

 function ads_h3($content) {
$ads='Полученный вами код';
$content=preg_replace('#<h3(.*?)</h3>#','<h3\1</h3><div class="b336x280">'.$ads.'</div>',$content, 3); return $content; } add_filter('the_content', 'ads_h3');

Обратите внимание, что h3 вы должны поменять на то, в чем у вас обрамляются подзаголовки статьи (не тот, что вверху, а те что внутри статьи). Кроме этого, цифра 3 ограничивает количество вставок. Т.е. если у меня будет 4 подзаголовка уровня h3 с публикации, то под последним реклама показывать не будет.

Хотите выводить блоки после тега More? Нет проблем. Вставляете

 function adsgoolge_ssd($content) {
$google_ads='
здесь ваш рекламный код
';
$content=preg_replace('#<span.*?id="more-(.*?)".*?></span>#','<span id="more-\1"></span></p><center>'.$google_ads.'</center><BR><p style="text-align: justify;">',$content);
return $content;
}
add_filter('the_content', 'adsgoolge_ssd');

А вот функция от уже упомянутого мною Камы:

function kama_content_advertise($text){
//спустя сколько символов искать перенос строки и вставлять рекламу?
    $nu = 1800;
//Код рекламы
    $adsense = <<<HTML
Код блока
HTML;
    //    return str_replace('<!--more-->', $adsense.'<!--more-->', $text);
    return preg_replace('@([^^]{'.$nu.'}.*?)(\r?\n\r?\n|</p>)@', "\\1$adsense\\2", trim($text), 1);
}
add_filter('the_content', 'kama_content_advertise', -10);
?>

Как вы думаете, что она делает. Все очень просто. Отсчитывается нужное число символов (1800 в нашем примере) от начала статьи, и после очередного закрывающего тега абзаца P вставляется РСЯ и Адсенс реклама. Замечательно? Да еще как, особенно если учитывать, что таких функций в functions.php можно добавить сколько надо и для каждой последующей увеличивать отступ в символах, чтобы они равномерно распределялись по статье.

Ну, и до кучи, хотя это не имеет отношения к нашему герою. У меня на главной выводятся блоки после некоторых анонсов статьей. Это реализовано в index.php:

<?php if (have_posts()) : ?><?php while (have_posts()) : the_post(); $loopcounter++; ?><div class="posts">

<?php if ($loopcounter == 2) { include (TEMPLATEPATH . '/google_left_kat.php'); } ?>
<?php if ($loopcounter == 4) { include (TEMPLATEPATH . '/google_left_kat.php'); } ?>
<?php if ($loopcounter == 7) { include (TEMPLATEPATH . '/google_left_kat.php'); } ?>
<div class="xsnazzy"> <b class="xtop"><b class="xb1"></b><b class="xb2"></b><b class="xb3"></b><b class="xb4"></b></b><div class="xboxcontent"><base target="_blank"><h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2><?php the_content('Читать полностью'); ?>

Сам же код рекламного блока живет в файле google_left_kat.php из папки с темой оформления. Сравните этот фрагмент index.php со своим и поймете, что на главной посты выводятся в цикле. Вот мы в него и вклиниваемся, отсчитывая с помощью $loopcounter количество анонсов, которые надо пропустить (2, 4, 7) до вставки рекламного блока. Сам блок позиционируется с помощью CSS.

Другие примеры использования functions.php


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

    <?php
    function new_excerpt_length($length) {
    	return 30;
    }
    add_filter('excerpt_length', 'new_excerpt_length');
    ?>

    А так же приводил пример фрагмента, позволяющего вместо троеточия в конце использовать стандартную ссылку «Читать далее»:

    <?php
    function new_excerpt_more($more) {
    return '<a href="'. get_permalink($post->ID) . '">' . ' Читать далее ..' . '</a>';
    }
    add_filter('excerpt_more', 'new_excerpt_more');
    ?>

    Для моих длинных заголовков я там использовал ограничение количества слов (до 7) в тайтле с помощью замены the_excerpt на:

    <?php do_excerpt(get_the_title(), 7); ?>

    Ну, а в файл functions.php при этом нужно было добавить такой вот фрагмент:

    function do_excerpt($string, $word_limit) {
    	$words = explode(' ', $string, ($word_limit + 1));
    	if (count($words) > $word_limit)
    	array_pop($words);
    	echo implode(' ', $words).' ...';
    }

    Все замечательно работает.

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

    Стандартный код расшаривания в Твиттер выглядел так:

    <a title="Затвитить пост!" target="_blank" rel="nofollow" href="http://twitter.com/home/?status=<?php the_title(); ?> <?php bloginfo('url'); ?>/?p=<?php the_ID(); ?>"><img src="<?php bloginfo('template_url'); ?>/image/rtwitter.png"></a>

    Я заменил в нем the_title () на trim_title_chars (110, '...'), а в functions.php дописал:

    function trim_title_chars($count, $after) {
    	$title = get_the_title();
    	if (mb_strlen($title) > $count) $title = mb_substr($title,0,$count);
    	else $after = '';
    	echo $title . $after;
    }

    Это ограничило длину отдаваемого в Твиттер тайтла 110 символами. Однако, мне больше понравился вариант задания ограничения в словах с помощью замены the_title () на trim_title_words (7, '...') и прописывании в нашу палочку-выручалочку следующей функции:

    function trim_title_words($count, $after) {
        $title = get_the_title();
        $words = split(' ', $title);
        if (count($words) > $count) {
            array_splice($words, $count);
            $title = implode(' ', $words);
        }
        else $after = '';
        echo $title . $after;
    }
  3. Хлебные крошки у меня на сайте сейчас формируются путем прописывания кода в functions.php, но об этом подробнее читайте в приведенной статье.
  4. В публикации Как в WordPress можно выводить последние записи из категории с миниатюрами я описывал функцию для этого файла, которая позволяет выдергивать первую картинку из любого поста в WordPress. Это может понадобиться при отсутствии миниатюр.

    <?php
    function catch_that_image() {
      global $post, $posts;
      $first_img = '';
      ob_start();
      ob_end_clean();
      $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
      $first_img = $matches [1] [0];
      if(empty($first_img)){ //Defines a default image
        $first_img = "/files/no-image.gif.jpg";
      }
      return $first_img;
    }
    ?>

    Результаты ее работы можете наблюдать внизу любой статьи (блок «Самое интересное»). Можно было бы, конечно же, и миниатюры создать, но мне так показалось проще.
  5. В статье Снижение потребляемой в WordPress памяти я приводил пример функции:

    function usage() {
    printf(('%d / %s'), get_num_queries(), timer_stop(0, 3));
    if ( function_exists('memory_get_usage') ) echo ' / '
     . round(memory_get_usage()/1024/1024, 2) . 'mb ';
    }
    add_action('admin_footer_text', 'usage');
    add_action('wp_footer', 'usage');

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

  6. В публикации под названием Оптимизация CSS в Page Speed я приводил пример функции, позволяющей отменить подключение файлов стилей, которые добавляют некоторые плагины в Вордпресс.

    Сами стили я переносил в основной файл Style.css из папки с используемой темой, потом узнавал нужные регистры в плагинах и прописывал в functions.php примерно такой код:

    add_action( 'wp_print_styles', 'my_deregister_styles', 100 );
    function my_deregister_styles() {
    	wp_deregister_style( 'syntaxhighlighter-theme-default' );
    	wp_deregister_style( 'syntaxhighlighter-core' );
    	wp_deregister_style( 'wp-pagenavi' );
    	wp_deregister_style( 'cfq' );
    }

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

    Тоже самое можно сделать и с файлами скриптов, которые подгружаются плагинами. Их можно объединить в один, а для всех остальных прописать:

    add_action( 'wp_print_scripts', 'my_deregister_javascript', 100 );
    function my_deregister_javascript() {
     wp_deregister_script( 'регистр 1-го WordPress плагина, отвечающий за подключение скрипта' );
            wp_deregister_script( 'регистр 2-го WordPress плагина' );
            wp_deregister_script( 'регистр 3-го WordPress плагина' );
    }
  7. Если вы хотите снизить вероятность взлома вашего блога на Вордпресс, а так же убрать все лишние мета теги из служебной области Html кода ваших страниц. Делается это опять же в нашем любимом файлике путем добавления такого вот фрагмента:
    remove_action( 'wp_head', 'feed_links_extra', 3 );
    remove_action( 'wp_head', 'feed_links', 2 );
    remove_action( 'wp_head', 'rsd_link' );
    remove_action( 'wp_head', 'wlwmanifest_link' );
    remove_action( 'wp_head', 'index_rel_link' );
    remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
    remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
    remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 );
    remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
    remove_action( 'wp_head', 'wp_generator' );
    remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
  8. Лично мне еще не нравится панель AdminBar, назойливо маячащая вверху окна браузера. Удалить ее можно, добавив в functions.php:
    add_filter( 'show_admin_bar', '__return_false' );
  9. Я не хочу, чтобы добавляемые в комментариях Урлы (типа http://ktonanovenkogo.ru) автоматически преобразовывались бы в активные гиперссылки. Ну, вот такая я редиска. Поэтому пришлось добавить такую строчку:
    remove_filter('comment_text', 'make_clickable', 9);
  10. Еще в комментариях я часто проставляю ссылки на другие свои посты, которые движком автоматически закрываются в rel="nofollow". Как бы мне это показалось не здорово и для исправления сложившейся ситуации в functions.php пришлось добавить:
    function remove_nofollow($string) {
    		$string = str_ireplace(' rel="nofollow"', '', $string);
    		return $string;
    	}
    	add_filter('comment_text', 'remove_nofollow');
  11. Вроде как усложняет жизнь взломщикам отмена выдачи кода ошибки при авторизации. Это может служить обратной связью для ускорения взлома, но мы это дело пресечем:
    add_filter('login_errors',create_function('$a', "return null;"));

Вроде бы это все, что удалось вспомнить. Жду от вас полезняшек в комментариях. Код вставлять лучше всего с помощью указанных над полем ввода тегов. Спасибо.

Удачи вам! До скорых встреч на страницах блога KtoNaNovenkogo.ru

Еще:

Рубрики :Основы WordPress

Комментарии и отзывы

Александр Майер

Дмитрий, молоток! Как всегда: все и сразу.

От себя могу добавить небольшой «хак», или как это называется. В общем, всем нам знакомо то, как WordPress некорректно отображает кавычки. Во-1 — они угловые, во-2: если взять слово в кавычки, иногда они отображаются в одну и ту же сторону, как перед словом, так и после. Лично меня это очень сильно напрягает. А решение есть очень простое, все через этот же файлик 🙂 В самом конце файла, перед закрывающим тегом прописываем три строки:

remove_filter('the_content', 'wptexturize'); // статьи, страницы
remove_filter('the_title', 'wptexturize'); // для заголовков
remove_filter('comment_text', 'wptexturize'); // для комментариев

Вуаля. Проблем с кавычками больше нет.

Юрий

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

 if ($loopcounter == 4) { include (TEMPLATEPATH . '/google_left_kat.php где будет мой созданный adsens.php'); } 
в index.php

после функции

-- End: Post --
и она сама сработает как нужно после 4-го поста, или еще что то нужно добавлять в functions.php? добавил
 php if (have_posts()) : ?><?php while (have_posts()) : the_post(); $loopcounter++; 
, выдает синтаксическую ошибку, может что то не так делаю. А также можно ли присвоить к каждому выводдимому виджету уникальные id или class. Спасибо!

Александр

Хороший материал спасибо.

Андрей

Спасибо. Долго ломал голову как убрать активные ссылки из комментариев. Оказывается всё очень просто.

Эдуард

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

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

Спасибо.

Дмитрий

Эдуард и Юрий: не разбираюсь в PHP (только на уровне синтаксиса и «отсюда взять — сюда вставить»). Пробуйте сами или задавайте вопросы профессионалам.

Александр Майер: спасибо большое за кавычки.

бырдырмыр

Дмитрий, не понял: опять у тебя прямые вхождения внутренних ссылок. Перестал что-ли заменять их на «тут» «здесь» и т.п. ?

Я у себя стал переделывать... не надо что-ли?

Павел

Дмитрий, а как вывести код только ПЕРЕД ПОСЛЕДНИМ подзаголовком h2?

Дмитрий

Павел: извините, но я так и не собрался с духом более менее серьезно ознакомиться с PHP, поэтому затрудняюсь ответить.

Иван

Здравствуйте! У меня случилась проблема с этим файлом. Я установил плагин который будет показывать мои PHP коды в виджетах. Но когда я вставляю свой код PHP

<?php codbanner(2); ?>

то вместо показа баннера показывается ошибка:

Fatal error: Call to undefined function codbanner() in /home/mohish12/domains/web-zarabotok.info/public_html/wp-content/plugins/php-code-widget/execphp.php(27) : eval()'d code on line 1

Что мне с этим делать? Помогите пожалуйста!

Андрей

После фразы «вам там лазить незачем» не стал читать дальше. Бесполезная статья.

Евгений

Дмитрий! Мне понравилось, как у тебя выводится миниатюры на другие статьи после слов «Читайте также». Подскажите пожалуйста вы их выводите каким-то плагинам? Или ваша сатитья «Как в WordPress можно выводить посты из категории с миниатюрами (их создание в Auto Post Thumbnail и catch_that_image)», как раз и описывает, как сделать, точно такие же миниатюры.

За ранее спасибо.

Дмитрий

Евгений: Здравствуйте! Да, именно в той статье создание этого блока и описано — http://ktonanovenkogo.ru/wordpress/wordpress_osnovi/kak-v-wordpress-mozhno-vyvodit-poslednie-zapisi-iz-kategorii-s-miniatyurami-prevyushkami.html

Подписаться не комментируя