Полезные WordPress хуки

Полезные хуки по работе с WordPress: фильтры, события и просто полезный PHP-код при разработке сайта на WordPress.

Отключить редакции WP

Ограничение количества редакций в WordPress
# Отключить редакции WP
add_filter("wp_revisions_to_keep", "my_revisions_to_keep");
function my_revisions_to_keep($revisions)
{
    return 0;
}

Ограничение количества редакций до 4-х.

# Ограничение редакций WP
add_filter("wp_revisions_to_keep", "my_revisions_to_keep");
function my_revisions_to_keep($revisions)
{
    return 4;
}

Отключение RSS-ленты

# Удаление ссылки RSS-ленты записей, комментариев, категорий и архивов
remove_action("wp_head", "feed_links", 2);
remove_action("wp_head", "feed_links_extra", 3);

Отключение dns-prefetch

# Удаление dns-prefetch
remove_action("wp_head", "wp_resource_hints", 2);

Будут удалены следующие строки:

<link rel="dns-prefetch" href="//fonts.googleapis.com" />
<link rel="dns-prefetch" href="//s.w.org" />

Удаление wlwmanifest

Используется для программы Windows Live Writer. Для удаления wlwmanifest используйте следующий код:

# Удаление wlwmanifest 
remove_action("wp_head", "wlwmanifest_link");

Удаление ссылки на RSD

Для удаления ссылки на сервис RSD (Really Simple Discovery) используйте следующий код:

# Удаление ссылки на RSD 
remove_filter("wp_head", "rsd_link");

Удаление ссылки REST API

# Удаление ссылки на REST API 
remove_action("wp_head", "rest_output_link_wp_head", 10);

Удалим из head следующую ссылку:

<link rel="https://api.w.org/" href="http://sitename/wp-json/" />

Удаление rel=’shortlink’

Чтобы удалить <link rel=’shortlink’ href=’https://site.ru/?p=734′ />, используйте следующий код:

// Удаление rel="shortlink"
remove_action('wp_head', 'wp_shortlink_wp_head');

Удаление max-image-preview:large

# Удаление <meta name='robots' content='max-image-preview:large' />
remove_filter('wp_robots', 'wp_robots_max_image_preview_large');

Удаление html { margin-top: 32px !important; }

Удаление блока кода, который добавляет отступ сверху из-за админ-бара.

// Удаление «html { margin-top: 32px !important; }» из header
add_action('get_header', 'remove_admin_bar_margin');
function remove_admin_bar_margin()
{
    remove_action('wp_head', '_admin_bar_bump_cb');
}

Отключить/включить админ-бар

Чтобы отключить админ-бар или включить, используйте код в function.php:

add_filter('show_admin_bar', '__return_true'); # Включить

// if (!is_user_logged_in()) {
    add_filter('show_admin_bar', '__return_false'); # Отключить
// }

Отключение Emojii

# Отключение Emojii
remove_action("wp_head", "print_emoji_detection_script", 7);
remove_action("admin_print_scripts", "print_emoji_detection_script");
remove_action("wp_print_styles", "print_emoji_styles");
remove_action("admin_print_styles", "print_emoji_styles");
remove_filter("the_content_feed", "wp_staticize_emoji");
remove_filter("comment_text_rss", "wp_staticize_emoji");
remove_filter("wp_mail", "wp_staticize_emoji_for_email");
add_filter("tiny_mce_plugins", "disable_wp_emojis_in_tinymce");
function disable_wp_emojis_in_tinymce($plugins)
{
    if (is_array($plugins)) {
        return array_diff($plugins, array("wpemoji"));
    } else {
        return array();
    }
}

Отключение wp-block-library-css

Для удаления подключения Gutenberg CSS используйте следующий код:

# Отключение wp-block-library-css 
wp_dequeue_style("wp-block-library");
wp_dequeue_style("wp-block-library-theme");

Изменить почту в админке WordPress без подтверждения

# Изменить почту в админке WordPress без подтверждения
remove_action("add_option_new_admin_email", "update_option_new_admin_email");
remove_action("update_option_new_admin_email", "update_option_new_admin_email");
function wpdocs_update_option_new_admin_email($old_value, $value)
{
    update_option("admin_email", $value);
}
add_action("add_option_new_admin_email", "wpdocs_update_option_new_admin_email", 10, 2);
add_action("update_option_new_admin_email", "wpdocs_update_option_new_admin_email", 10, 2);
Изменение почты админа в WordPress без подтверждения

Подтверждать новый e-mail будет не нужно. На почту лишь придёт уведомление о смене почты.

Убрать (скрыть) версию WordPress

# Удалить версии CSS и JS файлов
add_filter("style_loader_src", "vc_remove_wp_ver_css_js", 9999);
add_filter("script_loader_src", "vc_remove_wp_ver_css_js", 9999);
function vc_remove_wp_ver_css_js($src)
{
    if (strpos($src, "ver="))
        $src = remove_query_arg("ver", $src);
    return $src;
}

# Удалить <meta name="generator" content="WordPress 1.2.3" />
add_filter("the_generator", "__return_empty_string");

Удалить иконку комментариев из админ бара WordPress

# Удаление иконки комментариев из админ бара
add_action("admin_bar_menu", "clean_admin_bar", 999);
function clean_admin_bar($wp_admin_bar)
{
    $wp_admin_bar->remove_node("comments");
}

Изменить текст в подвале админки

# Изменяем текст в подвале админки
add_filter("admin_footer_text", "footer_admin_func");
function footer_admin_func () {
    echo 'Разработка темы: <a href="https://only-to-top.ru" target="_blank">YourName</a>.';
}

Длина обрезки отрывка и изменение последних символов — excerpt_length(), excerpt_more()

Чтобы задать число выводимых слов статьи (по дефолту — 55), существует фильтр excerpt_length а для замены конструкции […] на конце — фильтр excerpt_more.

Код для functions.php

# Длина excerpt
add_filter("excerpt_length", function () {
    return 20;
});

# Символы на конце excerpt
add_filter("excerpt_more", function ($more) {
    return "...";
});

Обрезать длину the_content()

Чтобы задать число выводимых символов заголовка, нам нужно создать функцию в 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;
}

Использовать так:

<?php trim_title_chars(55, "..."); ?> 

Второй способ:

# Обрезаем the_content
# Выводить echo content(80); вместо the_content()
function content($limit)
{
    $content = explode(" ", get_the_content(), $limit);
    if (count($content) >= $limit) {
        array_pop($content);
        $content = implode(" ", $content) . ".";
    } else {
        $content = implode(" ", $content);
    }
    $content = preg_replace("/[.+]/", "", $content);
    $content = apply_filters("the_content", $content);
    $content = str_replace("]]>", "]]&gt;", $content);
    return $content;
}

Для вывода использовать:

<?= content(38); ?> 

Показать используемый шаблон $template

Для того чтобы вывести какой шаблон используется на странице, добавим следующий PHP-код в functions.php:

add_action("wp_head", "show_template");
function show_template()
{
    global $template;
    echo '<div style="padding:20px;background:#1b5e20;color:#fff;text-align:center;">👉 ' . basename($template) . ' 👈</div>';
}

Показать текущий шаблон WP в консоли JavaScript:

add_action("wp_head", "show_template");
function show_template()
{
    global $template;
    echo '<script>console.log("👉 ' . basename($template) . ' 👈")</script>';
}

Показать текущий шаблон в админ баре WordPress:

add_action('admin_bar_menu', 'tpl_in_admin_bar');
function tpl_in_admin_bar()
{
    global $wp_admin_bar, $template;

    $wp_admin_bar->add_menu(array(
        'id'     => 'wpse-form-in-admin-bar',
        'parent' => 'top-secondary',
        'title'  => '👉 ' . basename($template) . ' 👈'
    ));
}

Какой тип записи (post_type) используется — get_post_type()

Пример: если тип записи collections — то выполнить необходимый PHP-код.

<?php $post_type = get_post_type($post_id);

if ($post_type == "collections") {
    // code
}; ?>

Ссылки на предыдущий/следующий пост

Данный код будет также отлично выводить ссылки на предыдущую/следующую страницу и для произвольных типов записей.

<?php
$prev_page = get_previous_post(); # Получаем объект предыдущего поста
$next_page = get_next_post();     # Получаем объект следующего поста

if ($prev_page->post_title) { # Если существует предыдущий пост
    echo '<a href="' . get_permalink($prev_page) . '" title="К посту: "' . esc_attr($prev_page->post_title) . '" class="prev-page">Back</a>';
};

if ($next_page->post_title) { # Если существует следующий пост
    echo '<a href="' . get_permalink($next_page) . '" title="К посту: "' . esc_attr($next_page->post_title) . '" class="next-page">Next</a>';
};
?>

Метки для страниц — фильтр display_post_states()

Рассмотрим, как добавить свои метки для страниц / записей при помощи фильтра display_post_states.

Добавление метки на странице post_state
add_filter("display_post_states", "admin_post_description", 10, 2);
function admin_post_description($post_states, $post)
{
    if ($post->post_type === "page") {

        if ($post->post_name === "video") { // Ярлык (slug) страницы
            $post_states[] = "Страница 'Преимущества'";
        }

        if ($post->ID === 293) { // id страницы
            $post_states[] = "Страница 'Публикации'";
        }

        // множественный выбор страниц
        if (in_array($post->ID, ["292", "25", "295"])) {
            $post_states[] = "Страница ...";
        }
    }
    return $post_states;
}

Дополнительные плюшки: