Корисні сніпети коду для покращення WordPress

Сніпети коду — це невеликі фрагменти коду, які додають на сайт новий функціонал або змінюють стандартну поведінку WordPress. Наприклад, з їх допомогою можна вимкнути на сайті коментарі, приховати верхню адмін-панель, додати до статей дату останнього оновлення або приблизний час читання. По суті, сніпет працює як маленький плагін для одного конкретного завдання.

Користуватися готовими сніпетами простіше, ніж може здатися. Вам не обов’язково розуміти код чи писати його самостійно. Зазвичай достатньо скопіювати готовий фрагмент та додати його до файлів сайту. Максимум підставити у якесь місце своє значення. А якщо сніпет не підійде або не спрацює, його можна просто видалити.

У цій статті зібрали корисні сніпети для WordPress, які допоможуть вам покращити адмінку, роботу з контентом, безпеку та користувальницький досвід.

Куди вставляти код

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

Уникнути цієї проблеми можна за допомогою дочірньої теми або плагіна типу «Code Snippets». Плагін робить те саме, тільки замість одного довгого файлу на хостингу ви працюєте в окремому розділі прямо в адмінці WordPress. У ньому сніпети відображаються як записи або сторінки: у кожного є назва, опис, налаштування та вимикач, щоб призупинити роботу сніпету без видалення.

Про роботу з плагіном Code Snippets у нас є невелика окрема інструкція. Якщо раніше ви не працювали з такими фрагментами коду, краще спочатку відкрити цю статтю, а потім повернутися до прикладів нижче.

Стаття на тему 👀
Як користуватися плагіном Code Snippets

1. Змінити помилку на сторінці входу

Коли користувач вводить неправильний логін або пароль, WordPress може підказати, що з цього виявилося неправильним. Для звичайного користувача це зручно, але загалом така практика небезпечна, оскільки це підказує зловмисникам.

Цей сніпет замінює конкретні помилки входу на універсальне повідомлення.

add_filter( 'login_errors', function () {
return 'Невірний логін або пароль.';
} );

Тепер WordPress не уточнюватиме, що саме введено неправильно.

2. Замінити логотип на сторінці входу

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

Спочатку завантажте логотип у медіатеку WordPress та скопіюйте посилання на файл. Потім вставте його в код замість https://example.com/logo.png.

add_action( 'login_head', function () {
$custom_logo = 'https://example.com/logo.png';
$logo_width = 120;
$logo_height = 120;

printf(
'<style>
.login h1 a {
background-image: url(%1$s) !important;
width: %2$spx;
height: %3$spx;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
</style>',
esc_url( $custom_logo ),
absint( $logo_width ),
absint( $logo_height )
);
} );

Якщо логотип відображається надто маленьким або надто великим, змініть значення:

$logo_width  = 120;
$logo_height = 120;

3. Вимкнути перевірку email адміністратора

WordPress регулярно просить підтвердити email адміністратора сайту. Це корисна страховка: якщо адреса застаріла, ви можете пропустити важливі повідомлення про сайт, безпеку або технічні проблеми. Але постійне нагадування може дратувати.

Цей сніпет вимкне перевірку email адміністратора. Після активації WordPress більше не буде показувати екран з проханням підтвердити адміністративний email при вході в панель управління.

add_filter( 'admin_email_check_interval', '__return_zero' );

Використовуйте цей сніпет лише якщо впевнені, що в налаштуваннях сайту вказаний актуальний email. Якщо адреса адміністратора зміниться, оновіть її вручну в розділі «Налаштування – Загальне», щоб не втратити важливі листи WordPress.

4. Приховати верхню адмін-панель WordPress

Коли ви увійшли до адмінки WordPress, зверху відображається чорна адмін-панель. Вона зручна для адміністраторів, але іноді заважає оцінити дизайн сайту, так як його бачать звичайні відвідувачі.

Цей сніпет сховає адмін-панель на фронтенді для всіх користувачів.

add_filter( 'show_admin_bar', '__return_false' );

Сніппет не видаляє доступ до адмінки. Ви все ще можете відкрити її за адресою: https://vashdomen.com/wp-admin/. Просто верхня панель більше не відображатиметься на сторінках сайту.

5. Обмежити кількість редакцій

WordPress зберігає редакції записів і сторінок кожного разу, коли ви змінюєте щось у публікації і натискаєте «Оновити». Це зручно: за потреби можна повернутись до попередньої версії тексту.

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

Цей сніпет обмежить кількість ревізій до 20 для кожного запису.

add_filter( 'wp_revisions_to_keep', function ( $limit, $post ) {
return 20;
}, 10, 2 );

Число можна змінити. Наприклад, якщо вам достатньо 10 редакцій, замініть 20 на 10.

return 10;

Сніппет обмежує нові редакції. Він не видаляє старі редакції, які вже є у базі даних. Щоб очистити їх, використовуйте окремий плагін для оптимізації бази даних, наприклад, WP-Optimize або Advanced Database Cleaner.

Перед видаленням старих редакцій обов’язково зробіть резервну копію бази даних. Після цього в плагіні очищення знайдіть пункт на кшталт «Post revisions», «Редакції записів» або «Revisions», запустіть очищення та перевірте сайт. Так ви спочатку зупините накопичення нових зайвих редакцій, а потім окремо приберете старі.

6. Повністю відключити коментарі на сайті

Якщо у вас є корпоративний сайт, лендинг, портфоліо або невеликий сайт послуг, коментарі можуть бути просто не потрібні. Більше того, вони часто стають джерелом спаму.

Цей сніпет відключить коментарі та трекбеки, прибере пункт коментарів з адмінки та приховає вже існуючі коментарі.

add_action( 'admin_init', function () {
global $pagenow;

if ( 'edit-comments.php' === $pagenow ) {
wp_safe_redirect( admin_url() );
exit;
}

remove_meta_box( 'dashboard_recent_comments', 'dashboard', 'normal' );

foreach ( get_post_types() as $post_type ) {
if ( post_type_supports( $post_type, 'comments' ) ) {
remove_post_type_support( $post_type, 'comments' );
remove_post_type_support( $post_type, 'trackbacks' );
}
}
} );

add_filter( 'comments_open', '__return_false', 20, 2 );
add_filter( 'pings_open', '__return_false', 20, 2 );
add_filter( 'comments_array', '__return_empty_array', 10, 2 );

add_action( 'admin_menu', function () {
remove_menu_page( 'edit-comments.php' );
} );

add_action( 'admin_bar_menu', function () {
remove_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 );
}, 0 );

Після активації сніпету коментарі перестануть відображатись на сайті. Але старі коментарі не втечуть з бази даних. Якщо ви вимкнете сніпет, вони можуть знову з’явитися.

7. Додати в адмінку час входу користувачів

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

Цей сніпет додає колонку «Останній вхід» до розділу «Користувачі».

add_filter( 'manage_users_columns', function ( $columns ) {
$columns['last_login'] = 'Останній вхід';

return $columns;
} );

add_filter( 'manage_users_custom_column', function ( $value, $column_name, $user_id ) {
if ( 'last_login' !== $column_name ) {
return $value;
}

$last_login = get_user_meta( $user_id, 'last_login', true );

if ( ! $last_login ) {
return 'Немає даних';
}

return date_i18n(
get_option( 'date_format' ) . ' ' . get_option( 'time_format' ),
$last_login
);
}, 10, 3 );

add_action( 'wp_login', function ( $user_login, $user ) {
update_user_meta( $user->ID, 'last_login', time() );
}, 10, 2 );

Cніппет почне збирати дані лише після активації. Він не покаже історію входів за минулі місяці.

8. Додати можливість дублювання постів

Іноді потрібно швидко створити дублікат сторінки чи запису. Наприклад, ви маєте готовий шаблон сторінки послуги, і ви хочете зробити на його основі нову сторінку.

На жаль, у стандартному функціоналі WordPress немає такої функції. Без сніпету потрібно копіювати контент у редакторі блоків та переносити вручну.

Ось код, який додасть посилання «Дублювати» для кожної публікації у розділі «Сторінки» та «Записи».

add_filter( 'post_row_actions', 'hostiq_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'hostiq_duplicate_post_link', 10, 2 );

function hostiq_duplicate_post_link( $actions, $post ) {
$post_type_object = get_post_type_object( $post->post_type );

if ( ! $post_type_object || ! current_user_can( $post_type_object->cap->create_posts ) ) {
return $actions;
}

$url = wp_nonce_url(
add_query_arg(
array(
'action' => 'hostiq_duplicate_post',
'post_id' => $post->ID,
),
admin_url( 'admin.php' )
),
'hostiq_duplicate_post_' . $post->ID,
'hostiq_duplicate_nonce'
);

$actions['hostiq_duplicate'] = '<a href="' . esc_url( $url ) . '">Дублювати</a>';

return $actions;
}

add_action( 'admin_action_hostiq_duplicate_post', function () {
if ( empty( $_GET['post_id'] ) ) {
wp_die( 'Не переданий ID запису.' );
}

$post_id = absint( $_GET['post_id'] );

if (
empty( $_GET['hostiq_duplicate_nonce'] ) ||
! wp_verify_nonce( $_GET['hostiq_duplicate_nonce'], 'hostiq_duplicate_post_' . $post_id )
) {
wp_die( 'Посилання застаріло. Спробуйте ще раз.' );
}

$post = get_post( $post_id );

if ( ! $post ) {
wp_die( 'Запис не знайдено.' );
}

$current_user = wp_get_current_user();

$new_post_id = wp_insert_post(
array(
'post_author' => $current_user->ID,
'post_content' => $post->post_content,
'post_excerpt' => $post->post_excerpt,
'post_status' => 'draft',
'post_title' => $post->post_title . ' копія',
'post_type' => $post->post_type,
'post_parent' => $post->post_parent,
'menu_order' => $post->menu_order,
'comment_status' => $post->comment_status,
'ping_status' => $post->ping_status,
)
);

if ( is_wp_error( $new_post_id ) ) {
wp_die( 'Не вдалося створити копію.' );
}

$taxonomies = get_object_taxonomies( $post->post_type );

foreach ( $taxonomies as $taxonomy ) {
$terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'slugs' ) );
wp_set_object_terms( $new_post_id, $terms, $taxonomy, false );
}

$post_meta = get_post_meta( $post_id );

foreach ( $post_meta as $meta_key => $meta_values ) {
foreach ( $meta_values as $meta_value ) {
add_post_meta( $new_post_id, $meta_key, maybe_unserialize( $meta_value ) );
}
}

wp_safe_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
exit;
} );

Нова копія створюється як чернетка. Це зручно: ви можете спокійно змінити заголовок, текст, SEO-налаштування та лише потім опублікувати сторінку.

9. Додати в адмінку дату зміни постів

У списку записів WordPress відображається дата публікації. Але іноді можливо важливо побачити, коли матеріал оновлювався востаннє.

Цей сніпет додає в адмінці окрему колонку «Остання зміна» для записів.

add_filter( 'manage_posts_columns', function ( $columns ) {
$columns['last_modified'] = 'Остання зміна';

return $columns;
} );

add_action( 'manage_posts_custom_column', function ( $column, $post_id ) {
if ( 'last_modified' === $column ) {
echo esc_html( get_the_modified_time( 'd.m.Y H:i', $post_id ) );
}
}, 10, 2 );

add_filter( 'manage_edit-post_sortable_columns', function ( $columns ) {
$columns['last_modified'] = 'modified';

return $columns;
} );

Це особливо корисно для блогів та баз знань. Допоможе швидко знайти статті, які давно не оновлювалися.

10. Додати до статей дату їхнього оновлення

Це може бути корисним для блогів і баз знань, щоб показати читачам, що інформація у статті підтримується в актуальному стані.

Цей сніпет додає повідомлення про останнє оновлення перед вмістом запису.

add_filter( 'the_content', function ( $content ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
return $content;
}

$published = get_the_time( 'U' );
$modified = get_the_modified_time( 'U' );

if ( $modified <= $published + DAY_IN_SECONDS ) {
return $content;
}

$updated_text = sprintf(
'<p class="last-updated" style="color:#999999;>Оновлено: %s</p>',
esc_html( get_the_modified_time( 'd.m.Y' ) )
);

return $updated_text . $content;
} );

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

11. Додати прогрес-бар читання до статей

Прогрес-бар показує, яку частину сторінки відвідувач уже прочитав. Зазвичай він відображається тонкою лінією у верхній частині сайту.

Це невелика деталь, але вона робить довгі статті зручнішими. Читачеві простіше зрозуміти, скільки матеріалу залишилося.

add_action( 'wp_body_open', function () {
if ( ! is_singular( 'post' ) ) {
return;
}

echo '<div id="reading-progress-bar"></div>';
} );

add_action( 'wp_head', function () {
if ( ! is_singular( 'post' ) ) {
return;
}

echo '<style>
#reading-progress-bar {
position: fixed;
top: 0;
left: 0;
width: 0%;
height: 4px;
background: #2271b1;
z-index: 99999;
transition: width 0.1s linear;
}

@media (min-width: 783px) {
.admin-bar #reading-progress-bar {
top: 32px;
}
}
</style>';
} );

add_action( 'wp_footer', function () {
if ( ! is_singular( 'post' ) ) {
return;
}

echo '<script>
document.addEventListener("scroll", function () {
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var scrollHeight = document.documentElement.scrollHeight - document.documentElement.clientHeight;
var progress = scrollHeight > 0 ? (scrollTop / scrollHeight) * 100 : 0;
var bar = document.getElementById("reading-progress-bar");

if (bar) {
bar.style.width = progress + "%";
}
});
</script>';
} );

Колір смужки можна змінити в цьому рядку:

background: #2271b1;

Наприклад, поставте колір вашого бренду.

12. Показати приблизний час для читання статті

Перед початком довгої статті корисно показати скільки часу займе читання. Наприклад: «Час читання: 6 хвилин».

Такий блок допомагає читачеві заздалегідь оцінити обсяг матеріалу.

add_filter( 'the_content', function ( $content ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
return $content;
}

$text = wp_strip_all_tags( strip_shortcodes( $content ) );

preg_match_all( '/[\p{L}\p{N}]+/u', $text, $matches );

$word_count = count( $matches[0] );
$reading_speed = 180;
$reading_time = max( 1, ceil( $word_count / $reading_speed ) );

$reading_text = sprintf(
'<p class="reading-time" style="color: #999999;">Час читання: %s хв.</p>',
absint( $reading_time )
);

return $reading_text . $content;
} );

У коді використовується швидкість читання 180 слів за хвилину.

$reading_speed = 180;

Якщо хочете рахувати більш швидко чи повільно, змініть це число.

Висновок

Сніпети коду — це зручний спосіб поступово покращувати WordPress без встановлення окремого плагіна під кожну дрібницю.

Головне правило — не перетворювати сайт на лабораторію без правил. Додавайте тільки ті сніпети, які справді вирішують ваше завдання.

Якщо у вас є улюблені сніпети для WordPress, поділіться ними у коментарях. А якщо якийсь код у статті не спрацював, повідомте про це, і ми оперативно це виправимо.

Чи була ця стаття корисною?

Дякуємо за відгук!
Створіть сайт на WordPress по нашому покроковому гайду. Можна спробувати безкоштовноПОЧАТИ СТВОРЮВАТИ САЙТ
+
Send this to a friend