Это список полезных функций WordPress, к которым я часто обращаюсь, чтобы улучшить или очистить свои сайты. Пожалуйста, будьте осторожны и делайте резервные копии.
Скрыть предупреждение об обновлении WordPress для всех, кроме администраторов
Используйте правильные заголовки WordPress
Создайте собственный виджет панели управления WordPress
Удалить все виджеты панели мониторинга
Включить навигационные меню
Вставить собственный логотип для входа
Изменить текст нижнего колонтитула администратора
Стили и сценарии постановки в очередь
Поставить в очередь Google шрифты
Изменить длину отрывка
Изменить ссылку «Читать далее»
Изменить еще отрывок
Отключить беспорядок с эмодзи
Удалить комментарии
Изменить URL-адрес медиагалереи
Создать собственный размер миниатюр
Добавить категории для вложений
Добавить теги для вложений
Добавить пользовательский отрывок на страницы
Создать глобальную строку
Поддержка избранных изображений
Форма поиска поддержки
Исключение страниц из поиска
Отключить XMLRPC
Экранирование HTML в сообщениях
Создать пользовательские глобальные настройки
Удалить панель администратора WordPress
Добавить метатеги Open Graph
Добавить пользовательский тип сообщения
Внедрение предварительного подключения к Google Fonts в темах
Добавить столбец миниатюр в список сообщений
Добавьте класс потенциальных клиентов в первый абзац
Исключить пользовательский тип сообщения из поиска
Удалить строку запроса из статических ресурсов
Отключить поле веб-сайта из формы комментариев
Изменить jQuery
Отключить API-интерфейс JSON Rest
Переключить тип сообщения
PHP-логгер
Всегда показывать вторую панель в TinyMCE
Удаление элементов меню администратора в зависимости от роли пользователя
Удаление пунктов меню администратора в зависимости от адреса электронной почты (домена)
Изменение порядка элементов меню администратора
Исключить категорию из циклов WordPress
Отключите сообщение «JQMIGRATE: Migrate установлена, версия 1.4.1»
Загрузите тяжелые сторонние скрипты позже для повышения производительности.
/** * Скрыть сообщение об обновлении WordPress для всех, кроме администраторов */ functionide_update_notice_to_all_but_admin() { if ( !current_user_can( 'update_core' )) { remove_action( 'admin_notices', 'update_nag', 3 ); } }add_action( 'admin_head', 'hide_update_notice_to_all_but_admin', 1);
Обязательно удалите тег <title>
из заголовка.
/** * Используйте правильные заголовки WordPress */add_theme_support('title-tag');
/** * Создание пользовательского виджета информационной панели WordPress */ function Dashboard_widget_function() { echo ' <h2>Пользовательский виджет информационной панели</h2> <p>Здесь пользовательский контент</p> '; }function add_dashboard_widgets() { wp_add_dashboard_widget('custom_dashboard_widget', 'Пользовательский виджет информационной панели', 'dashboard_widget_function' ); }add_action('wp_dashboard_setup', 'add_dashboard_widgets');
/** * Удалить все виджеты информационной панели */ function remove_dashboard_widgets() { global $wp_meta_boxes; unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press'] ); unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links'] ); unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now'] ); unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins'] ); unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_drafts'] ); unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments'] ); unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary'] ); unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_вторичный'] ); Remove_meta_box('dashboard_activity', 'dashboard', 'normal'); }add_action('wp_dashboard_setup', 'remove_dashboard_widgets');
/** * Включаем меню навигации */function Register_my_menu() { Register_nav_menu( 'nav-menu', __('Меню навигации') ); }add_action('init', 'register_my_menu');
Вставьте это туда, где вы хотите, и сохраните меню в Appearance -> Menus .
wp_nav_menu(array('theme_location' => 'nav-menu'));
Вот код для нескольких меню:
function register_my_menus() { Register_nav_menus( array( 'new-menu' => __( 'Новое меню'), 'another-menu' => __( 'Другое меню'), 'an-extra-menu' => __( «Дополнительное меню») ) ); }add_action('init', 'register_my_menus');
/** * Вставляем собственный логотип для входа */ function custom_login_logo() { echo ' <style> .login h1 a { background-image: url(image.jpg) !important; размер фона: 234px 67px; ширина: 234 пикселей; высота: 67 пикселей; дисплей: блок; } </style> '; }add_action('login_head', 'custom_login_logo');
/** * Изменить текст нижнего колонтитула администратора */ functionmodify_footer() { echo 'Создано <a href="mailto:[email protected]">вы</a>.'; }add_filter('admin_footer_text', 'modify_footer');
/** * Ставим в очередь стили и скрипты */ function custom_scripts() { wp_enqueue_style( 'bootstrap', get_template_directory_uri() . '/css/bootstrap.min.css', array(), '3.3.6' ); wp_enqueue_style('стиль', get_template_directory_uri(). '/css/style.css'); wp_enqueue_script('bootstrap', get_template_directory_uri(). '/js/bootstrap.min.js', array('jquery'), '3.3.6', true); wp_enqueue_script('script', get_template_directory_uri(). '/js/script.js'); }add_action('wp_enqueue_scripts', 'custom_scripts');
/** * Ставим в очередь Google Fonts */ function google_fonts() { wp_register_style( 'OpenSans', '//fonts.googleapis.com/css?family=Open+Sans:400,600,700,800' ); wp_enqueue_style('OpenSans'); }add_action('wp_print_styles', 'google_fonts');
/** * Изменение длины отрывка */ function custom_excerpt_length( $length ) { return 25; }add_filter('excerpt_length', 'custom_excerpt_length', 999);
/** * Изменить ссылку «Читать дальше» */ function custom_read_more_link() { return '<a href="' . get_permalink() . '">Подробнее</a>'; }add_filter('the_content_more_link', 'custom_read_more_link');
/** * Изменить дополнительную выдержку */ function custom_more_excerpt( $more ) { return '...'; }add_filter('excerpt_more', 'custom_more_excerpt');
/** * Отключить беспорядок с эмодзи */ functiondisable_wp_emojicons() { remove_action( 'admin_print_styles', 'print_emoji_styles' ); 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_filter('wp_mail', 'wp_staticize_emoji_for_email'); Remove_filter('the_content_feed', 'wp_staticize_emoji'); Remove_filter('comment_text_rss', 'wp_staticize_emoji'); add_filter('tiny_mce_plugins', 'disable_emojicons_tinymce'); add_filter('emoji_svg_url', '__return_false'); }add_action('init', 'disable_wp_emojicons'); functiondisable_emojicons_tinymce($plugins) { return is_array($plugins)? array_diff($plugins, array('wpemoji')): array(); }
/** * Удалить комментарии */ // Удаляет из меню администратора function my_remove_admin_menus() { remove_menu_page( 'edit-comments.php'); }add_action( 'admin_menu', 'my_remove_admin_menus');// Удаляет из публикации и страниц. function remove_comment_support() { remove_post_type_support( 'post', 'comments' ); Remove_post_type_support('страница', 'комментарии'); }add_action( 'init', 'remove_comment_support', 100);// Удаляет из панели администратора function mytheme_admin_bar_render() { global $wp_admin_bar; $wp_admin_bar->remove_menu('комментарии'); }add_action('wp_before_admin_bar_render', 'mytheme_admin_bar_render');
/** * Изменить URL-адрес медиа-галереи */ if ( пустой( get_option( 'upload_url_path' ) ) ) { update_option( 'upload_url_path', 'http://assets.website.com/wp-content/uploads' ); }
Кроме того, вы можете фильтровать значение параметра до его получения из базы данных, что немного лучше:
/** * Изменить URL-адрес медиа-галереи */ add_filter( 'pre_option_upload_url_path', function() { return 'http://assets.website.com/wp-content/uploads'; });
/** * Создание собственного размера миниатюры */ add_image_size( 'custom-thumbnail', 250, 250, true );
Получить миниатюру
$thumb = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'custom-thumbnail' );echo $thumb[0];
Начиная с WordPress 4.4.0, вы можете использовать:
the_post_thumbnail_url($размер);
/** * Добавляем категории для вложений */ function add_categories_for_attachments() { Register_taxonomy_for_object_type( 'category', 'attachment' ); }add_action('init', 'add_categories_for_attachments');
/** * Добавляем теги для вложений */ function add_tags_for_attachments() { Register_taxonomy_for_object_type( 'post_tag', 'attachment' ); }add_action('init', 'add_tags_for_attachments');
/** * Добавление пользовательского отрывка на страницы */ function add_page_excerpt() { add_post_type_support( 'page', array( 'excerpt' ) ); }add_action('init', 'add_page_excerpt');
/** * Создание глобальной строки */ function global_string() { return 'String'; }
Получить поле
эхо global_string();
/** * Поддержка избранных изображений */ add_theme_support('post-thumbnails');
/** * Поддержка формы поиска */ add_theme_support( 'html5', array( 'search-form' ) );
/** * Исключение страниц из поиска */ function ignore_pages_from_search() { global $wp_post_types; $wp_post_types['page']->exclude_from_search = true; }add_action('init', 'exclude_pages_from_search');
/** * Отключить xmlrpc.php */ add_filter( 'xmlrpc_enabled', '__return_false' );remove_action( 'wp_head', 'rsd_link' );remove_action( 'wp_head', 'wlwmanifest_link' );
/** * Экранирование HTML в тегах <code> или <pre><code>. */ function escapeHTML($arr) { if (version_compare(PHP_VERSION, '5.2.3') >= 0) { $output = htmlspecialchars($arr[2], ENT_NOQUOTES, get_bloginfo('charset'), false); } else { $specialChars = array( '&' => '&', '<' => '<', '>' => '>' ); // декодируем уже преобразованные данные $data = htmlspecialchars_decode($arr[2]); // экранируем все данные внутри <pre> $output = strtr($data, $specialChars); } if (! пусто($output)) { return $arr[1] . $выход. $арр[3]; } Еще {возврат $arr[1] . $арр[2] . $арр[3]; } }function filterCode($data) { // Раскомментируйте, если хотите экранировать что-либо внутри тега <pre> //$modifiedData = preg_replace_callback( '@(<pre.*>)(.*)(</pre>) @isU', 'escapeHTML', $data); $modifiedData = preg_replace_callback( '@(<code.*>)(.*)(</code>)@isU', 'escapeHTML', $data ); $modifiedData = preg_replace_callback( '@(<tt.*>)(.*)(</tt>)@isU', 'escapeHTML', $modifiedData ); вернуть $modifiedData; }add_filter('content_save_pre', 'filterCode', 9);add_filter('excerpt_save_pre', 'filterCode', 9);
Изменено из Escape HTML.
/** * Создание пользовательских глобальных настроек */ function custom_settings_page() { ?> <div class="wrap"> <h1>Пользовательские настройки</h1> <form метод="post" action="options.php"> <?php settings_fields('section'); do_settings_sections('параметры темы'); кнопка_отправить(); ?> </форма> </div><?php }function custom_settings_add_menu() { add_theme_page( 'Пользовательские настройки', 'Пользовательские настройки', 'manage_options', 'custom-settings', 'custom_settings_page', null, 99 ); }add_action( 'admin_menu', 'custom_settings_add_menu' );// Пример функции настройки Setting_twitter() { ?> <input type="text" name="twitter" id="twitter" value="<?php echo get_option('twitter'); ?>" /><?php }function custom_settings_page_setup() { add_settings_section( 'section' , «Все настройки», null, «параметры темы»); add_settings_field('twitter', 'Имя пользователя Twitter', 'setting_twitter', 'theme-options', 'section' ); Register_setting('раздел', 'Твиттер'); }add_action('admin_init', 'custom_settings_page_setup');
Получить поле
echo get_option('Твиттер');
Изменено на странице «Создание страницы настроек темы WordPress с помощью API настроек».
/** * Удалить панель администратора WordPress */function remove_admin_bar() { Remove_action( 'wp_head', '_admin_bar_bump_cb'); }add_action('get_header', 'remove_admin_bar');
/** * Добавляем метатеги Open Graph */function Meta_og() { global $post; if ( is_single() ) { if ( has_post_thumbnail( $post->ID ) ) { $img_src = wp_get_attachment_image_src ( get_post_thumbnail_id ( $post->ID ), 'thumbnail' ); } $excerpt = Strip_tags($post->post_content); $excerpt_more = ''; if (strlen($excerpt) > 155) {$excerpt = substr($excerpt,0,155); $excerpt_more = '...'; } $excerpt = str_replace( '"', '', $excerpt ); $excerpt = str_replace( "'", '', $excerpt ); $excerptwords = preg_split( '/[nrt ]+/ ', $excerpt, -1, PREG_SPLIT_NO_EMPTY ); array_pop($excerptwords); implode(' ', $excerptwords) $excerpt_more ?><meta name="author" content="Ваше имя"> <meta name="description" content="<?php echo $excerpt; ?>"> <meta property="og:title" content="<?php echo the_title(); ?>"> <meta property="og:description" content="<?php echo $excerpt; ?>"> <meta property="og:type" content="article"> <meta property="og:url" content="<?php echo the_permalink(); ?>"> <meta property="og:site_name" content="Имя вашего сайта"> <meta property="og:image" content="<?php echo $img_src[0]; ?>"><?php } Еще {возвращение; } }add_action('wp_head', 'meta_og', 5);
/** * Добавить пользовательский тип сообщения */function create_custom_post() { Register_post_type( 'custom-post', // слаг для пользовательского типа сообщения array( 'labels' => array( 'name' => __( 'Custom Post' ), ), 'public' => true, 'hierarchical' => true, 'has_archive' => true, 'supports' => array( 'title', 'editor', 'отрывок', 'миниатюра' ), 'can_export' => true, 'таксономии' => массив( 'post_tag', 'категория' ) )); }add_action('init', 'create_custom_post');
/** * Реализуйте предварительное подключение к шрифтам Google в темах */function двадцать пятнадцать_resource_hints( $urls, $relation_type ) { // Проверяет, несет ли субъект источник шрифтов Google, и `$relation_type` равен предварительному подключению. // Замените `enqueue_font_id` на `ID`, использованный при загрузке источника. if ( wp_style_is( 'enqueue_font_id', 'queue') && 'preconnect' === $relation_type ) { // Проверяет, больше ли версия WordPress или равна 4.7 // чтобы обеспечить совместимость со старыми версиями // потому что 4.7 стало необходимо возвращать массив вместо строки if ( version_compare( $GLOBALS['wp_version'], '4.7-alpha', '>=' ) ) { // Массив с URL-адресами шрифтов Google и перекрестным происхождением $urls[] = array( 'href' => 'https://fonts.gstatic.com', 'crossorigin', ); } else { // Строка с URL-адресом шрифтов Google $urls[] = 'https://fonts.gstatic.com'; } } Вернуть $urls; }add_filter('wp_resource_hints', 'twentyfifteen_resource_hints', 10, 2);
/** * Добавить столбец миниатюр в список сообщений */add_image_size( 'admin-list-thumb', 80, 80, false );function wpcs_add_thumbnail_columns( $columns ) { if (!is_array($columns)) $columns = array(); $новый = массив(); foreach( $columns as $key => $title) { if ( $key == 'title' ) // Помещаем столбец "Миниатюра" перед столбцом "Заголовок" $new['featured_thumb'] = __( 'Image'); $new[$key] = $title; } Вернуть $новый; } function wpcs_add_thumbnail_columns_data($column, $post_id) {переключатель ($column) {case 'featured_thumb': echo '<a href="'. $post_id. '">'; echo the_post_thumbnail('admin-list-thumb'); эхо '</a>'; перерыв; } }if ( function_exists( 'add_theme_support')) { add_filter( 'manage_posts_columns', 'wpcs_add_thumbnail_columns'); add_action( 'manage_posts_custom_column', 'wpcs_add_thumbnail_columns_data', 10, 2); }
/** * Добавляем класс потенциальных клиентов в первый абзац */function first_paragraph( $content) { return preg_replace( '/<p([^>]+)?>/', '<p$1 class="lead">', $контент, 1); }add_filter('the_content', 'first_paragraph');
Добавляет класс lead
в первый абзац в the_content.
/** * Исключаем произвольный тип сообщения из поиска */function ignorePages( $query ) {if ( $query->is_search ) { $query->set( 'post_type', 'post' ); } Вернуть $запрос; }add_filter('pre_get_posts','excludePages');
/** * Удалить строку запроса из статических ресурсов */ function remove_cssjs_ver( $src ) { if ( strpos( $src, '?ver=' ) ) $src = remove_query_arg( 'ver', $src ); вернуть $источник; }add_filter( 'style_loader_src', 'remove_cssjs_ver', 10, 2);add_filter( 'script_loader_src', 'remove_cssjs_ver', 10, 2);
/** * Изменить jQuery */functionmodify_jquery() { wp_deregister_script('jquery'); wp_register_script('jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js', false, '3.2.1'); wp_enqueue_script('jquery'); }if (!is_admin()) add_action('wp_enqueue_scripts', 'modify_jquery');
/** * Отключить поле веб-сайта из формы комментариев */functiondisable_website_field( $field ) { if( isset($field['url'])) ) { unset($field['url']); } Вернуть $поле; }add_filter('comment_form_default_fields', 'disable_website_field');
/** * Отключить JSON REST API */add_filter('json_enabled', '__return_false');add_filter('json_jsonp_enabled', '__return_false');
/** * Переключение типа сообщения */function switch_post_type ( $old_post_type, $new_post_type ) { global $wpdb; // Запускаем запрос на обновление $wpdb->update( $wpdb->posts, // Устанавливаем массив( 'post_type' => $new_post_type), // Где массив( 'post_type' => $old_post_type ) ); }
/** * Регистратор PHP */function php_logger($data) { $output = $data; if (is_array($output)) $output = implode(',', $output); // выводим результат в консоль JavaScript echo "<script>console.log( 'PHP LOG: " . $output . "' );</script>"; }
/** * Всегда показывать вторую панель в TinyMCE */function show_tinymce_toolbar( $in ) { $in['wordpress_adv_hidden'] = false; вернуть $в; }add_filter('tiny_mce_before_init', 'show_tinymce_toolbar');
/** * Клонируем роль администратора */function clone_admin_role() { global $wp_roles; if (! isset($wp_roles)) $wp_roles = new WP_Roles(); $adm = $wp_roles->get_role('администратор'); // Добавляем новую роль «Клиент» со всеми возможностями администратора $wp_roles->add_role( 'client', 'Client', $adm->capabilities ); }add_action( 'init', 'clone_admin_role');/** * Укажите, какие пункты меню администратора будут видны пользователям с ролью «Клиент» */function remove_dashboard_menus() { if ( current_user_can( 'client' )) { // Скрыть Обновления в меню панели инструментов Remove_submenu_page('index.php', 'update-core.php' ); // Скрыть комментарии remove_menu_page('edit-comments.php'); // Скрыть плагины remove_menu_page('plugins.php'); // Скрываем темы, настройщик и виджеты в меню «Внешний вид» Remove_submenu_page( 'themes.php', 'themes.php' ); Remove_submenu_page('themes.php', 'customize.php?return='. urlencode($_SERVER['REQUEST_URI'])); Remove_submenu_page('themes.php', 'widgets.php'); // Скрыть инструменты Remove_menu_page('tools.php'); // Скрыть общие настройки remove_menu_page('options-general.php'); } }add_action('admin_menu', 'remove_dashboard_menus');
/** * Укажите, какие пользователи могут видеть элементы меню администратора на основе их адреса электронной почты */function remove_dashboard_menus() { $user_data = get_userdata( get_current_user_id() ); $user_email = isset($user_data->user_email)? $user_data->user_email: ''; if ( ! strpos( $user_email, '@yourcompany.com' ) ) { // Скрыть обновления в меню информационной панели Remove_submenu_page( 'index.php', 'update-core.php' ); // Скрыть комментарии remove_menu_page('edit-comments.php'); // Скрыть плагины remove_menu_page('plugins.php'); // Скрываем темы, настройщик и виджеты в меню «Внешний вид» Remove_submenu_page( 'themes.php', 'themes.php' ); Remove_submenu_page('themes.php', 'customize.php?return='. urlencode($_SERVER['REQUEST_URI'])); Remove_submenu_page('themes.php', 'widgets.php'); // Скрыть инструменты Remove_menu_page('tools.php'); // Скрыть общие настройки remove_menu_page('options-general.php'); } }add_action('admin_menu', 'remove_dashboard_menus');
/** * Изменение порядка меню администратора */function custom_menu_order( $menu_ord ) { if ( ! $menu_ord ) { return true; } Возвращаем массив( 'index.php', 'separator1', 'edit.php?post_type=page', 'редактировать.php', 'edit.php?post_type=[your_post_type_slug]', 'upload.php', 'edit-comments.php', 'separator2', 'themes.php', 'plugins.php', 'users.php', 'tools .php', 'опции-general.php' ); } }add_filter( 'custom_menu_order', 'custom_menu_order');add_filter('menu_order', 'custom_menu_order');
/** * Исключаем категорию из всех циклов WordPress */add_action( 'pre_get_posts', function( $query ) { // анонимный обратный вызов глобальный $wp_query; // Жестко закодированный идентификатор категории, но может быть динамическим: esc_attr(get_option('your-cat-id')); $excluded_cat_id = 25; // добавляем идентификатор категории к существующей, не перезаписываем его $cat[] = $query->get( 'cat' ); $кошка[] = "-" . $excluded_cat_id; $query->set('кот', $cat); } });
add_action('wp_default_scripts', function ($scripts) { if (!empty($scripts->registered['jquery'])) { $scripts->registered['jquery']->deps = array_diff($scripts-> зарегистрированный['jquery']->deps, ['jquery-migrate']); } });
Lighthouse и подобные инструменты анализа производительности всегда жалуются на сценарии (и стили), блокирующие рендеринг, короткий срок жизни кэша и т. д. Большинство этих сценариев и стилей поступают из сторонних источников, которые мы не можем контролировать — собственный диспетчер тегов и аналитика Google, Facebook. Пиксель, другие трекеры, скрипты чата и т. д. Однако мы можем загружать их только тогда, когда реальный пользователь взаимодействует со страницей, что значительно снижает показатель Time To Interactive и дает гораздо более высокие результаты производительности.
В зависимости от того, где вы хотите разместить эти сторонние скрипты, вы можете либо использовать действие wp_footer
для печати кода в нижнем колонтитуле, либо поместить его в основной скрипт app.js
, который, в свою очередь, ставится в очередь действия wp_enqueue_scripts
.
<script>var запущен = ложь; window.addEventListener('scroll', () => { if (fired === false) { fired = true; setTimeout(() => { // Здесь находятся маркетинговые сценарии. }, 1000) // 1000 мс или 1 с работает нормально, но вы можете настроить этот таймаут. }});</script>