Найкращі скрипти, сніпети, хуки, хаки, трюки для файлу functions.php WordPress [!ОНОВЛЮЄТЬСЯ!]

Привіт:) У цьому пості я зібрав корисні сніпети та трюки для functions.php — головного файлу будь-якої теми WordPress. Для зручності відсортував за тематикою та областю застосування.

Зміст

Вимкнути Gutenberg для віджетів

/**
 * Disable Gutenberg in Widgets
 */
add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
add_filter( 'use_widgets_block_editor', '__return_false' ); 

Як перевірити, що ми знаходимося у користувацькій частині сайту

if ( ! is_admin() && ! current_user_can( 'manage_options' ) ) {
  // знаходимося у користувацькій частині сайту
}

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

Кожна публікація WordPress має унікальний слаг (slug), який автоматично генерується за назвою вашої публікації або прописується вручну в редакторі. Якщо в опублікованому пості чи сторінці змінити цей слаг, WordPress запам’ятає старий і перенаправить його на новий. Щоб заборонити таку дію, виконайте 2 дії.

  1. Видаліть із бази даних архів старих слагів через наступний SQL-запит
DELETE FROM `wp_postmeta` WHERE `meta_key` = '_wp_old_slug';
  1. У файл functions.php вставте код:
/**
 * Removing the redirect after changing a post/pages slug
 */
remove_action( 'template_redirect', 'wp_old_slug_redirect' ); 
remove_action( 'post_updated',      'wp_check_for_changed_slugs', 12, 3 );
до змісту ↑

Як визначити сторінку блогу (архіву записів)

Якщо є статична сторінка, яка вказана у Налаштування -> Читання -> Ваша домашня сторінка відображає -> Сторінка записів (Settings -> Reading -> Your homepage displays -> Posts page).

if ( is_home() && ! is_front_page() ) {
    echo 'IS BLOG PAGE';
} else {
    echo 'IS NOT BLOG PAGE';
}

Як визначити сторінку блогу (архіву записів) або сторінку посту

if ( ( is_home() && ! is_front_page() ) || ( is_singular( 'post' ) ) ) {
    var_dump( 'IS BLOG PAGE OR POST PAGE' );
} else {
    var_dump( 'NO BLOG PAGE AND NO POST PAGE' );
}

Як додати користувацькі типи записів (CPT) у пошук

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

/**
 * Add custom post types (CPT) "books" to search
 */
add_action( 'pre_get_posts', 'mp_add_cpt_books_to_search' );
function mp_add_cpt_books_to_search( $query ) {
	if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
		$query->set( 'post_type', array( 'post', 'books' ) );
	}
}
до змісту ↑

Як для всіх сторінок сайту у тег <html> додати власний атрибут

Наприклад, тег виглядає так:

<html lang="uk">

Його потрібно змінити на наступний:

<html lang="uk" newattribute="newvalue">

Для цього використайте простий код

/**
 * Add new attribute to <html tag
 */
add_filter( 'language_attributes', 'mp_add_new_attribute_to_html_tag' );
function mp_add_new_attribute_to_html_tag( $output ) {
    return $output . ' newattribute="newvalue"';
}
до змісту ↑

Як організувати пошук на всьому сайті виключно за вказаними постами/сторінками

/**
 * Search on the entire site exclusively for the specified posts/pages
 */
add_action( 'pre_get_posts', function( $query ) {
	if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) {
		
        /* Var 1 - Включаємо пошук виключно для постів/сторінок із вказаними ID */

		$include_pages_ids = array( 2, 55 );
		$query->set( 'post__in', $include_pages_ids );

		/* Var 2 - Включаємо пошук виключно для постів/сторінок із вказаними слагами */
		
		$include_pages_slugs = array( 'sample-page', 'sample-page-2' );
		$query->set( 'post_name__in', $include_pages_slugs );
	}
});
до змісту ↑

Змінити стандартні написи у формі коментування

function mp_change_comments_form_labels( $defaults ) {
    // Текст перед формою коментування
    $defaults['title_reply'] = 'Текст перед формою';
    // Текст кнопки у формі коментування
    $defaults['label_submit'] = 'Текст кнопки';
    
    return $defaults;
}
add_filter( 'comment_form_defaults', 'mp_change_comments_form_labels' );

Додати кнопку розриву сторінки у візуальний редактор TinyMCE


add_filter( 'mce_buttons', 'mp_add_tinymce_page_break' );
function mp_add_tinymce_page_break( $mce_buttons ) {
	$pos = array_search( 'wp_more', $mce_buttons, true );

	if( $pos !== false ) {
		$buttons = array_slice( $mce_buttons, 0, $pos );
		$buttons[] = 'wp_page';
		$mce_buttons = array_merge( $buttons, array_slice( $mce_buttons, $pos ) );
	}

	return $mce_buttons;
}

Як програмно вимкнути архіви

/**
 * Remove WordPress archives
 */
add_action( 'template_redirect', 'mp_remove_wp_archives' );
function mp_remove_wp_archives() {
    if( is_category() || is_tag() || is_date() || is_author() ) {
        global $wp_query;
        $wp_query->set_404();
    }
}

Як автоматично додати атрибут lightbox посиланням на зображення

add_filter( 'the_content', 'mp_add_lightbox_attr_to_image_links' );
function mp_add_lightbox_attr_to_image_links( $content ) {
    $pattern ="/<a(.*?)href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\")(.*?)>/i";
    $replacement = '<a$1href=$2$3.$4$5 rel="lightbox"$6>';
    $content = preg_replace( $pattern, $replacement, $content );

    return $content;
}

Як завантажувати бібліотеку jQuery із Google CDN

WordPress вже містить в собі бібліотеку jQuery, яка використовується як самим движком, так і різними темами та плагінами. За необхідності ви можете змусити ВордПрес завантажувати jQuery із зовнішнього сховища (CDN).

У WordPress бібліотека jQuery іноді оновлюється разом із самим движком. І саме тому використання конкретної версії jQuery із зовнішнього сховища може бути зручнішим за використання вбудованої версії — так як не всі теми та плагіни можуть бути сумісні з новішою версією jQuery. Зробити це можна за допомогою наступного коду:

add_action( 'init', 'mp_jquery_from_cdn' );
function mp_jquery_from_cdn() {
    if ( ! is_admin() ) {
        wp_deregister_script( 'jquery' );
        $jqueryUrl = 'https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js';
        wp_register_script( 'jquery', $jqueryUrl, false, null, false );
        wp_enqueue_script( 'jquery' );
    }
}
до змісту ↑

Контент у редакторі Gutenberg за замовчуванням при створенні нової публікації

add_filter( 'the_editor_content', 'mp_set_default_editor_content', 1000, 2 );
function mp_set_default_editor_content( $content, $default_editor ) {
    global $pagenow;
    if ( 'post-new.php' === $pagenow ) {
        ob_start();
        ?>
        <p>Default content here...</p>
        <?php
        
        return ob_get_clean();
    }
    
    return $content;
}

Як вивести на екран текст копірайту із поточним роком

function mp_get_copyright( $startYear, $siteName ) {
	$copyrightText = '';
	$currentYear = date( 'Y' );
	
	if ( $startYear != $currentYear ) {
		$copyrightText = 'Copyright &copy; ' . $startYear . '-' . $currentYear . ' ' . $siteName;
	} else {
		$copyrightText = 'Copyright &copy; ' . $startYear . ' ' . $siteName;
	}
	
	return $copyrightText;
}

Виклик функції для виведення копірайту:

echo mp_get_copyright( початковий_рік, "назва_компанії" );

Наприклад, для цього блогу:

echo mp_get_copyright( 2021, "petrov.net.ua" );

Результат роботи функції:

Copyright © 2021-2023 petrov.net.ua
до змісту ↑

Як автоматично вставити власний (кастомний) вміст перед основним контентом запису/сторінки

/**
 * Insert custom content before main content (on the example of a Single Post)
 */
add_filter( 'the_content', 'mp_insert_custom_content_before_main_content' );
function mp_insert_custom_content_before_main_content( $content ) {
	if ( is_single() ) {
        $customContent = 'CUSTOM CONTENT BEFORE MAIN CONTENT';
    	$content = $customContent . $content;
	}

	return $content;
};

Як автоматично вставити власний (кастомний) вміст після основного контенту запису/сторінки

/**
 * Insert custom content after main content (on the example of a Single Post)
 */
add_filter( 'the_content', 'mp_insert_custom_content_after_main_content' );
function mp_insert_custom_content_after_main_content( $content ) {
	if ( is_single() ) {
		$customContent = 'CUSTOM CONTENT AFTER MAIN CONTENT';
    	$content .= $customContent;
	}
	
    return $content;
};

Як автоматично вставити власний (кастомний) вміст після заголовку запису/сторінки

/**
 * Insert custom content at the end of Title (on the example of a Single Post)
 */
add_filter( 'the_title', 'mp_insert_custom_content_at_the_end_of_title' );
function mp_insert_custom_content_at_the_end_of_title( $title ) {
	if ( is_single() ) {
		$customTitle = 'CONTENT AT THE END OF TITLE';
    	$title .= $customTitle;
	}

	return $title;
};

Як автоматично вставити власний (кастомний) вміст після конкретного параграфу запису/сторінки

/**
 * Insert custom content after a certain paragraph (on the example of a Single Post)
 */
add_filter( 'the_content', 'mp_insert_custom_content_after_a_certain_paragraph' );
function mp_insert_custom_content_after_a_certain_paragraph( $content ) {
	if ( ! is_single() )
	return $content;
	
	$newСontent = '';

	// Номер абзацу, після якого буде виводитися ваш вміст
	$paragraphAfter = 1; 
    // Ваш вміст
	$contentAfterParagraph = 'CONTENT AFTER A CERTAIN PARAGRAPH';

	$content = explode ( "</p>", $content );
	
	for ( $i = 0; $i < count ( $content ); $i++ ) {
		if ( $i == $paragraphAfter ) {
			$newСontent .= $contentAfterParagraph;
		}

		$newСontent .= $content[$i] . "</p>";
	}

	return $newСontent;
}
до змісту ↑

Перевірка чи переглядає сайт користувач із правами Адміністратора

// Варіант 1

if ( current_user_can( 'administrator' ) && current_user_can( 'manage_options' ) ) {
    // Адміністратор
}


// Варіант 2

if ( current_user_can( 'manage_options' ) ) {
    // Адміністратор
}

Як увімкнути режим розробки (Maintenance Mode)

add_action( 'get_header', 'mp_maintenance_mode' );
function mp_maintenance_mode() {
	if  ( ! current_user_can( 'administrator' ) && ! current_user_can( 'manage_options' ) || ! is_user_logged_in () ) {
		wp_die( 'Сайт знаходиться у розробці...' );
	}
}

Як дозволити завантажувати файли SVG через Медіабібліотеку

За замовчуванням у WordPress не підтримується завантаження файлів SVG. А тому при завантаженні такого файлу через адмін-меню Медіафайли -> Додати новий ви отримаєте повідомлення про помилку:

Файл «logo.svg» не вдалося завантажити.
Sorry, you are not allowed to upload this file type.

Щоб обійти це обмеження, додайте наступний код у файл functions.php:

/**
 * Enable SVG Support
 */
add_filter( 'upload_mimes', 'mp_svg_upload_allow' );
function mp_svg_upload_allow( $mimes ) {
    $mimes['svg']  = 'image/svg+xml';
    return $mimes;
}

add_filter( 'wp_check_filetype_and_ext', 'mp_fix_svg_mime_type', 10, 5 );
function mp_fix_svg_mime_type( $data, $file, $filename, $mimes, $real_mime = '' ) {
    if ( version_compare( $GLOBALS['wp_version'], '5.1.0', '>=' ) )
        $dosvg = in_array( $real_mime, ['image/svg', 'image/svg+xml'] );
    else
        $dosvg = ( '.svg' === strtolower( substr( $filename, -4 ) ) );

    if ( $dosvg ) {
        if ( current_user_can( 'manage_options' ) ) {
            $data['ext']  = 'svg';
            $data['type'] = 'image/svg+xml';
        } else {
            $data['ext'] = $type_and_ext['type'] = false;
        }
    }

    return $data;
}

add_filter( 'wp_prepare_attachment_for_js', 'mp_show_svg_in_media_library' );
function mp_show_svg_in_media_library( $response ) {
    if ( $response['mime'] === 'image/svg+xml' ) {
        $response['image'] = [
            'src' => $response['url'],
        ];
    }

    return $response;
}
до змісту ↑

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

Михайло Петров
Михайло Петров

Мене звати Михайло. Я є WordPress-розробником. Створюю сайти з "нуля", розробляю плагіни, оновлюю наявний функціонал та підтримую готові проєкти.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *