Тема для WordPress – функции

Функции в WordPress

Поговорим о файле functions.php.
Казалось бы, функции вынесенные во внешний файл, что тут необычного?

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

Например, плагин maxsite-memory-usage.php от Макса определяет объём использованной памяти и количество запросов, а состоит всего из четырёх строк:

add_action(‘wp_footer’, ‘maxsite_memory_usage’);
function maxsite_memory_usage() {
    if ( function_exists(‘memory_get_usage’) ) echo ‘ Потребление памяти: ‘ . round(memory_get_usage()/1024/1024, 2) . ‘MB’;
}

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

Мелочь? Да, если эта функция одна. А если их десяток – это уже, как минимум сокращение на десять запросов к базе данных.

Что сюда можно добавить? Любой код, как из плагинов, так и собственный:

Начнём с кода файла index.php, выдернутого наугад из первой попавшейся темы:

//Окончания слова “комментарий” – то есть, “2 комментария”, “5 комментариев” и так далее.
function russ_comments_number($zero = false, $one = false, $more = false, $deprecated = ”) {
    global $id;
    $number = get_comments_number($id);
    if ($number == 0) {
        $output = ‘Прокомментируете?’;
    }
    elseif ($number == 1) {
        $output = ‘1 комментарий’;
    }
    elseif (($number > 20) && (($number % 10) == 1)) {
        $output = str_replace(‘%’, $number, ‘% комментарий’);
    }
    elseif ((($number >= 2) && ($number <= 4)) || ((($number % 10) >= 2) && (($number % 10) <= 4)) && ($number > 20)){
        $output = str_replace(‘%’, $number, ‘% комментария’);
    }
    else {
        $output = str_replace(‘%’, $number, ‘% комментариев’);
    }
    echo apply_filters(‘russify_comments_number’, $output, $number);
}
add_filter(‘comments_number’, ‘russ_comments_number’);

//Блокировка своего собственного пинга
function no_self_ping(&$links) {
    $home = get_option( ‘home’ ); foreach ( $links as $l => $link ) if ( 0 === strpos( $link, $home ) ) unset($links[$l]);
}
add_action( ‘pre_ping’, ‘no_self_ping’ );

//Удаление дубликатов содержимого из обхода поисковых роботов
$index_category_pages = true;
function seofriend_wp_head() {
    global $index_category_pages;
    if($index_category_pages){
        if( ( (is_single() || is_page() || is_home()) && (!is_paged()) ) || is_category()){
            echo “<meta name=”robots” content=”index,follow” />n”;
        }else{
            echo “<meta name=”robots” content=”noindex,follow” />n”;
        }
    }else{
        if((is_single() || is_page() || is_home()) && (!is_paged())){
            echo “<meta name=”robots” content=”index,follow” />n”;
        }else{
            echo “<meta name=”robots” content=”noindex,follow” />n”;
        }
    }
}
add_action(‘wp_head’, ’seofriend_wp_head’);

//Добавление социальных закладок в записи. В нужном месте вставить <?php social(); ?>
function social() {
    $u = urlencode(get_permalink());
    $t = get_the_title();
    $social=<<<EOF
    function so(u,t) {
        for (i=0; i<s.length; i=i+2) document.write(‘<a title=”Добавить закладку на эту статью Levati’s blog-а в ‘+s[i]+’” href=”http://’+s[i]+’/'+s[i+1].replace(‘{u}’,u).replace(‘{t}’,t)+’” target=”_blank”>’+
‘<img src=”путь_к_папке_с_иконками’+s[i]+’.ico” border=”0? alt=”Добавить в ‘+s[i]+’” width=”16? height=”16? /></a>’);
    }
    var s=new Array(“del.icio.us”,”post?url={u}&title={t}”, “news2.ru”,”add_story.php?url={u}”, “google.com”,”bookmarks/mark?op=edit&bkmk={u}&title={t}”, “bobrdobr.ru”,”add.html?url={u}&title={t}”, “memori.ru”,”link/?sm=1&u_data[url]={u}&u_data[name]={t}”, “moemesto.ru”,”post.php?url={u}&title={t}”, “mister-wong.ru”,”add_url/?bm_url={u}&bm_description={t}”, “rumarkz.ru”,”bookmarks/?action=add&popup=1&address={u}&title={t}&description={t}”, “rucity.com”,”bookmarks.php?action=add&address={u}&title={t}&description=”, “linkstore.ru”,”servlet/LinkStore?a=add&url={u}&title={t}”, “myscoop.ru”,”add/?title={t}&URL={u}”, “vaau.ru”,”submit/?action=step2&url={u}”, “newsland.ru”,”News/Add/type/news/”);
    EOF;
    echo <<<EOF
    <p class=”social”><script type=’text/javascript’>$social so (‘$u’, encodeURIComponent(‘$t’));</script></p>
    EOF;
}

//Напоминание об RSS-подписке
function subscribe_remind($content) {
    if ( !is_feed() && !is_page() && !is_home() && !is_search() && !is_archive() && !is_author() && !is_category() && !is_paged())
    $content .= ‘<div id=”remind”>Будьте в курсе новостей сайта, <a href=”url_Вашей_RSS_ленты”>Подпишитесь на RSS ленту</a>!</div>’;
    return $content;
}
add_filter(‘the_content’, ’subscribe_remind’, 999);

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

if ( function_exists(‘register_sidebar’) )
register_sidebar(array(
    ‘before_widget’ => ‘<div>’, //тег перед виджетом
    ‘after_widget’ => ‘</div>’, //тег после виджета
    ‘before_title’ => ‘<h2>’, //тег перед заголовком виджета
    ‘after_title’ => ‘</h2>’, //тег после заголовка виджета
));

Виджеты – это находка для любящих поэкспериментировать: лучше, если справа вывести рубрики и ссылки, а слева архив и поиск, или если наоборот поменять? А может… вот именно виджетизированный скин и подойдёт для определения “может” и “не может”.

Если же Вы точно знаете, чего хотите – пропишите это в теме статически и сэкономьте еще немного памяти.

PS: За давностью коллекции некоторые авторы утеряны, но примазываться к чужой славе не по-взрослому, потому, если в перечне кто-то узнает свои функции – в комментарии укажите ссылку на оригинал, в записи я поставлю его напрямую.

Читайте в этой серии:

4 комментария

  1. avatar

    vkatunin

    Познавательный цикл.
    А вот было бы еще интересно об тех значочках почитать, что внизу каждой статьи; о регистрации rss-ленты.
    (Я не очень нахально себя веду? ) 🙄

    • avatar

      levati

      Наоборот, очень любознательно 😉
      Иконки добавления в социальные сети разместил в записи, там же уведомление о подписке по RSS.

  2. avatar

    vkatunin

    Да, вот еще: к тем значочкам, что внизу, неплохо бы прописать “title” для гиперссылок (например: “ставить закладку на статью такую-то блога Leati’s в Гугле”).