Полезные сниппеты кода для улучшения 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