Вивчаємо WordPress

274
  • Як вносити зміни в functions.php і все не поламати
  • Як вставляти блоки РМЯ і Адсенс з допомогою functions.php
  • Інші приклади використання functions.php
  • Здрастуйте, шановні читачі блогу . Сьогодні хотів об’єднати в рамках одного поста всі варіанти використання файлу functions.php, які мені доводилося коли-небудь пробувати і які працюють на моєму блозі зараз. Живе цей файл практично в кожній папці теми для Вордпресс, ну, а якщо ви його там не знайдете, то не буде проблемою його створити.

    Вивчаємо WordPress

    Якщо ви використовуєте досить просунуту тему оформлення, то в functions.php швидше за все будуть прописані різні можливості налаштувань її зовнішнього вигляду і функціоналу. Самі ці налаштування будуть доступні з адмінки WordPress, і вам лазити в цій файл буде нема чого. Але крім усього іншого цей чудовий файлик може творити чудеса, частина з яких буде описана нижче.

    Як вносити зміни в functions.php і все не поламати

    Так, хотів одразу попросити вас доповнити описані нижче функції тими, які використовуєте ви. Бажано було б ще й невеликі пояснення до них приартачить в коментарях. Давайте ділитися своїми знахідками для загального блага всіх власників блогів на Вордпрес.

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

    Тому він і є найкращим способом доопрацювання функціоналу движка під ваші задачі, а не пряма редагування системних файлів. Як я вже згадав, при оновленні до нової версії всі ваші зміни у файлах движка можуть бути потерті і вам доведеться їх відновлювати по пам’яті, або копатися у бекапі для їх відновлення.

    Дуже неприємне заняття, доповім я вам. Розуміти, що ви це вже зробили, але зараз не в змозі пригадати як. Выбешивает це справа по страшному. А ось з functions.php все шоколадно.

    При будь-яких апдейта движка він залишиться незмінним, і навіть якщо ви за збігом обставин його зіпсуєте або втратите, то його зовсім не складно буде знайти у бекапі — це вам не десяток файлів движка відшукувати, які ви не пам’ятаєте, як називалися.

    Так і при зміні теми оформлення достатньо буде просто скопіювати вміст цього файлика (за винятком тієї частки, яка належала до старої теми) для збереження потрібного вам функціоналу.

    Отже, про пристрій тем WordPress читайте тут. Стаття розповідає про призначення шаблонів та логікою їх підключення.

    Вивчаємо WordPressВивчаємо WordPress

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

    Якщо з яких-небудь причин в папці з вашою темою такого цінного об’єкта виявлено не буде, то вам всього лише потрібно буде його там створити з допомогою FileZilla, про яку я писав тут. Відкриваєте папку з темою:

    wp-content/themes/назва

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

    Вивчаємо WordPressВивчаємо WordPress

    Чудово. Я не знавець мови PHP, але всі функції, які ви будете додавати в цей файл, повинні обрамляться конструкцією:

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

    Ну, що поробиш. Я і сам всіх цих тонкощів не знаю (так само як і ця мова програмування), а просто відчуваю з досвіду. Тому, якщо хочете все по науці, то доведеться прочитати цю статтю Шановного Ками.

    Загалом по будь-якому спочатку обов’язково робіть бекап, як це було описано тут, а вже потім беріться за експерименти.

    Категорично не раджу вносити зміни в functions.php через адмінку Вордпресс (Зовнішній вигляд — Редактор — Функції теми).

    Вивчаємо WordPressВивчаємо WordPress

    В цьому випадку у вас не буде можливості відкату назад при невдалому експерименті і не буде підсвічування синтаксису мови PHP, яка при належному навику відразу ж допоможе вам зрозуміти, що ви робите щось не так. Таким способом можна працювати, якщо тільки у вас з якихось загадкових причин відсутній доступ до сайту по ФТП.

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

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

    ?>

    Однак, якщо код кожної функції окремо обрамляєте цими тегами, то черговий шедевр вставляйте після закриваючого тега останнього фрагмента. Зрозуміло? Та мені й самому було б не зрозуміло з такого пояснення, але чого то сьогодні я недорікуватий (чи як це сказати стосовно клавіатурі).

    Як вставляти блоки РМЯ і Адсенс з допомогою functions.php

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

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

    Відразу обмовлюся про відміну вставки коду Google AdSense, описаного тут і блоків коду РМЯ, про які йшлося тут.

    Власне, у першому випадку ніяких нюансів — вставляєте код як є і все має працювати. Інша справа РМЯ. У його коді мають місце бути одинарні лапки, які можуть викликати помилки, якщо їх не екранувати. Робиться це з допомогою простановки зворотного слеша перед кожною з таких лапок (їх багато).

    Вивчаємо WordPressВивчаємо WordPress

    Взагалі, блоки Рмя цікаві тим, що їх зовнішній вигляд можна правити прямо з коду, як це описано в статті про налаштування контекстних оголошень рекламної мережі Яндекса.

    Для початку подивимося, як можна використовувати короткі коди і ручний метод вставки рекламного блоку. Для цього додаєте в 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(‘##’,’ ‘.$ads.’
    ‘,$content, 3); return $content; } add_filter(‘the_content’, ‘ads_h3’);

    Зверніть увагу, що h3 ви повинні поміняти на те, в чому у вас обрамляються підзаголовки статті (не той, що вгорі, а ті що всередині статті). Крім цього, цифра 3 обмежує кількість вставок. Тобто якщо у мене буде 4 підзаголовку рівня h3 з публікації, то під останнім реклама показувати не буде.

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

    function adsgoolge_ssd($content) {
    $google_ads=’
    тут ваш рекламний код
    ‘;
    $content=preg_replace(‘##’,’

    ‘.$google_ads.’

    ‘,$content);
    return $content;
    }
    add_filter(‘the_content’, ‘adsgoolge_ssd’);

    А ось функція від вже згаданого мною Ками:

    function kama_content_advertise($text){
    //через скільки символів шукати перенесення рядка і вставляти рекламу?
    $nu = 1800;
    //Код реклами
    $adsense = <<)@’, «\\1$adsense\\2», trim($text), 1);
    }
    add_filter(‘the_content’, ‘kama_content_advertise’, -10);
    ?>

    Як ви думаєте, що вона робить. Все дуже просто. Відраховується потрібне число символів (1800 в нашому прикладі) від початку статті, і після чергового закриваючого тега абзацу P вставляється РМЯ і Адсенс реклама. Чудово? Та ще й як, особливо якщо враховувати, що таких функцій functions.php можна додати скільки треба і для кожної наступної збільшувати відступ в символах, щоб вони рівномірно розподілялися по статті.

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

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

    Інші приклади використання functions.php

  • У статті про налаштування відображення статей у категорія Вордпресс я згадував функцію для functions.php, яка дозволяла змінювати кількість виведених в описі статті символів при заміні the_content на the_excerpt. Якщо не зрозуміло про що мова, то дивіться саму статтю.

    Вивчаємо WordPressВивчаємо WordPress

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

    ID) . ‘»>’ . ‘Читати далі ..’ . ‘‘;
    }
    add_filter(‘excerpt_more’, ‘new_excerpt_more’);
    ?>

    Для моїх довгих заголовків я там використовував обмеження кількості слів (до 7) в тайтлі з допомогою заміни the_excerpt на:

    Ну, а в файл 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).’ …’;
    }

    Все чудово працює.

  • Так само я активно використовую і інші способи скорочення своїх занадто довгих Тайтлов. Наприклад, для стандартної кнопки додавання в Твіттер довелося використовувати щось подібне, бо в іншому випадку користувачам доводилося самим обрізати звільнюється в цю соціалку текст і вони мені на це нарікали.

    Стандартний код розшарювання в Твіттер виглядав так:

    Вивчаємо WordPress

    Я замінив в ньому 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;
    }

  • Хлібні крихти у мене на сайті зараз формуються шляхом прописування коду functions.php але про це докладніше читайте у цій статті.
  • У публікації Як в WordPress можна виводити останні записи з категорії зі слайдами я описував функцію для цього файлу, яка дозволяє висмикувати першу картинку з будь-якого поста в WordPress. Це може знадобитися при відсутності мініатюр.

    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;
    }
    ?>

    Вивчаємо WordPressВивчаємо WordPress

    Результати її роботи можете спостерігати внизу будь-якої статті (блок «найцікавіше»). Можна було б, звичайно ж, і мініатюри створити, але мені так здалося простіше.

  • У статті Зниження споживаної в 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’);

    Вона буде виводити в адмінці і в футері вашого блогу число скоєних запитів до бази даних при генерації сторінки, час витрачений на цій дійство і кількість отъеденной при цьому оперативної пам’яті.

    Вивчаємо WordPressВивчаємо WordPress

  • У публікації під назвою Оптимізація 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’ );
    }

  • Якщо ви хочете знизити ймовірність злому вашого блогу на Вордпресс, а так само прибрати всі зайві мета теги зі службової області 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 );
  • Особисто мені ще не подобається панель AdminBar, настирливо маячащая вгорі вікна браузера. Видалити можна, додавши в functions.php:
    add_filter( ‘show_admin_bar’, ‘__return_false’ );
  • Я не хочу, щоб додаються в коментарях Урли (типу https:// автоматично перетворювалися б у активні гіперпосилання. Ну, ось така я редиска. Тому довелося додати таку строчку:
    remove_filter(‘comment_text’, ‘make_clickable’, 9);
  • Ще у коментарях я часто проставляю посилання на інші свої пости, які движком автоматично закриваються в rel=»nofollow». Як би мені це здалося не здорово і для виправлення ситуації, що склалася в functions.php довелося додати:
    function remove_nofollow($string) {
    $string = str_ireplace(‘ rel=»nofollow»‘, «, $string);
    return $string;
    }
    add_filter(‘comment_text’, ‘remove_nofollow’);
  • Ніби як ускладнює життя злодіям скасування видачі коду помилки при авторизації. Це може служити зворотним зв’язком для прискорення злому, але ми це справа пресечем:
    add_filter(‘login_errors’,create_function(‘$a’, «return null,»));
  • Начебто це все, що вдалося згадати. Чекаю від вас полезняшек в коментарях. Код вставляти найкраще з допомогою зазначених над полем вводу тегів. Спасибі.

    Удачі вам! До зустрічей на сторінках блогу