25 сниппетов для увеличения производительности WordPress
Для всех любителей покопаться в WordPress коде наша сегодняшняя статья. Так сказать — в поисках интересных идей для кастомизации и увеличения производительности сайта. Не каждый сниппет так уж сильно полезен, но благодаря им можно зачастую понять, на что вообще способна CMS. Большинство этих сниппетов было написано для запуска из файла темы functions.php. Но вы всегда можете написать отдельный плагин, и это представляется лучшим решением. Многие разработчики также пишут свои функции в отдельных файлах, чтоб включать их, не трогая активную тему. Не зависимо от того, как вы примените эти сниппеты, они усовершенствуют любой WordPress вебсайт.
1.Окрашивание строк в таблицах админ-панели согласно статусам записей
Административная панель WordPress оформлена в достаточно шаблонном стиле, но если смотреть с расстояния, то все начинает сливаться в одно пятно. Этот сниппет позволит вам окрасить строки в таблицах в зависимости от статуса записи (черновик, ожидает проверки, личная и т. д.)
add_action('admin_footer','posts_status_color'); function posts_status_color(){ ?> <style> .status-draft{background: #FCE3F2 !important;} .status-pending{background: #87C5D6 !important;} .status-publish{/* no background keep wp alternating colors */} .status-future{background: #C6EBF5 !important;} .status-private{background:#F2D46F;} </style> <?php }
2. Показ и кеширование последних твитов
На тему того, как выводить фолловеров в Twitter и последние твиты с помощью API-запросов написано множество статей. WordPress может иногда сбивать с толку, особенно, если вы применяете пользовательский плагин кэширования. Этот код использует Transient API для кэширования запросов с настраиваемым временем следующей чистки.
/** * Get the latest Tweet Text by Username * * @uses Transient - API for chaching * @copyright Mathias Schopmans - 10/2010 * * @param string $username: Twitter Username */ function get_last_tweet($username='nasenmann'){ if (false === ($last_tweet = get_transient('last_tweet_by_'.$username))) { $res = wp_remote_get('http://twitter.com/statuses/user_timeline/'.$username.'.json'); $tweets = json_decode($res['body']); foreach ($tweets as $tweet){ if(empty($tweet->in_reply_to_user_id)){ $last_tweet = $tweet->text; break; } } set_transient('last_tweet_by_'.$username, $last_tweet, 10*60); } return $last_tweet; } print_r(get_last_tweet());
3. Автоматическое очищение плагина W3 Total Cache
Если ваш сайт динамический, то на некоторых его страницах может содержаться контент, отправленный пользователями. Так как функция кэширования не включена в WordPress по умолчанию, то взамен вы можете использовать плагины типа W3 Total Cache. Но без ручной очистки, обновление кэша будет происходить только по истечении указанного периода времени. Ручной перезапуск оправдан только, если у вас обычный блог или сайт со статичным контентом
// purge entire cache if(function_exists('w3tc_pgcache_flush')) { w3tc_pgcache_flush(); } // flush individual post/page if (function_exists('w3tc_pgcache_flush_post')) { w3tc_pgcache_flush_post($post_id); }
4. Ограничить или отключить создание версий записей
Ваша база данных может быстро переполниться тысячами версий записей. Зачем вам нужно 50 разных версий одного и того же поста? Резервное копирование сайта может обернуться настоящим кошмаром с такой раздутой базой данных. Попробуйте этот сниппет, позволяющий либо совсем отключить создание версий, либо установить их максимально допустимое количество.
Этот код должен быть добавлен в файл wp-config.php в корневом каталоге вашего сайта
// disable post revisions define('WP_POST_REVISIONS', false); // limit five post revisions define('WP_POST_REVISIONS', 5);
5. Отключить автоматическое обновление WordPress
Разработчики WordPress стараются сделать процесс обновления более простым для обычных пользователей. Небольшие обновления движка происходят в его серверной части в автоматическом режиме. Но если вам хочется обновляться исключительно вручную, тратя на это собственное время, то сниппет вам в помощь.
Этот код должен быть добавлен в файл wp-config.php в корневом каталоге вашего сайта
define('WP_AUTO_UPDATE_CORE', false);
6.Включить HTTPS-протокол для «небезопасных» медиафайлов
Загрузка файлов с помощью внешнего сервера типа MaxCDN часто более быстра, но там не всегда присутствует поддержка протокола HTTPS. Если на вашем сайте есть страницы, защищенные протоколом SSL, то вы не увидите ни зеленого замочка, ни голубой адресной строки. Вместо этого вы получите сообщение о том, что на странице есть небезопасные элементы.
Держу пари, что есть платные решения для загрузки медиа по протоколу SSL, но это будет стоить дополнительных денежных вложений, что не все могут себе позволить, так что вы можете попробовать этот сниппет, который осуществляет принудительную передачу любых SSL-страницы с «небезопасными» медиафайлами по протоколу HTTP.
add_action('wp_head','nocdn_on_ssl_page'); function nocdn_on_ssl_page() { if($_SERVER['HTTPS'] == "on") { define('DONOTCDN', true); } }
7. Запрашивать миниатюру записи
Если у вас крупный блог или онлайн-журнал, где каждая запись должна быть украшена миниатюрой, то этот сниппет может чудесным образом вам помочь. Новые авторы часто публикуют записи без миниатюр, потому что забывают их прикрепить или вообще не желают себя этим утруждать.
Этот код проверяет, прикреплены ли миниатюры к загружаемой записи. Если картинок нет, то запись сохранится в виде черновика, а автору показывается сообщение об ошибке. Можно быть уверенным в том, что не будет опубликован ни один пост без миниатюры.
add_action('save_post', 'wpds_check_thumbnail'); add_action('admin_notices', 'wpds_thumbnail_error'); function wpds_check_thumbnail($post_id) { // change to any custom post type if(get_post_type($post_id) != 'post') return; if ( !has_post_thumbnail( $post_id ) ) { // set a transient to show the users an admin message set_transient( "has_post_thumbnail", "no" ); // unhook this function so it doesn't loop infinitely remove_action('save_post', 'wpds_check_thumbnail'); // update the post set it to draft wp_update_post(array('ID' => $post_id, 'post_status' => 'draft')); add_action('save_post', 'wpds_check_thumbnail'); } else { delete_transient( "has_post_thumbnail" ); } } function wpds_thumbnail_error() { // check if the transient is set, and display the error message if ( get_transient( "has_post_thumbnail" ) == "no" ) { echo "<div id='message' class='error'><p><strong>You must select Featured Image. Your Post is saved but it can not be published.</strong></p></div>"; delete_transient( "has_post_thumbnail" ); } }
8. Добавление пользовательских размеров изображений.
Загруженное изображение может быть вклеено в запись с использованием пользовательских размеров.
Сразу после установки WordPress у вас появляется доступ к некоторому количеству встроенных размеров изображений. Вы также можете создать свои собственные параметры для изменения размеров картинки, которые можно выбирать в графическом редакторе.
add_action('save_post', 'wpds_check_thumbnail'); add_action('admin_notices', 'wpds_thumbnail_error'); function wpds_check_thumbnail($post_id) { // change to any custom post type if(get_post_type($post_id) != 'post') return; if ( !has_post_thumbnail( $post_id ) ) { // set a transient to show the users an admin message set_transient( "has_post_thumbnail", "no" ); // unhook this function so it doesn't loop infinitely remove_action('save_post', 'wpds_check_thumbnail'); // update the post set it to draft wp_update_post(array('ID' => $post_id, 'post_status' => 'draft')); add_action('save_post', 'wpds_check_thumbnail'); } else { delete_transient( "has_post_thumbnail" ); } } function wpds_thumbnail_error() { // check if the transient is set, and display the error message if ( get_transient( "has_post_thumbnail" ) == "no" ) { echo "<div id='message' class='error'><p><strong>You must select Featured Image. Your Post is saved but it can not be published.</strong></p></div>"; delete_transient( "has_post_thumbnail" ); } }
9. Автоматические шорткоды для медиа
Встроенный в WordPress WYSIWYG-редактор имеет множество потрясающих функций. Дополнительные же сниппеты позволяют авторам выбирать различные шорткоды из выпадающего списка. Вы можете быстро вклеить медиа или написать пользовательские функции, которые запускаются в областях записей.
add_action('media_buttons','add_sc_select',11); function add_sc_select(){ global $shortcode_tags; /* ------------------------------------- */ /* enter names of shortcode to exclude bellow */ /* ------------------------------------- */ $exclude = array("wp_caption", "embed"); echo ' <select id="sc_select"><option>Shortcode</option>'; foreach ($shortcode_tags as $key => $val){ if(!in_array($key,$exclude)){ $shortcodes_list .= '<option value="['.$key.'][/'.$key.']">'.$key.'</option>'; } } echo $shortcodes_list; echo '</select>'; } add_action('admin_head', 'button_js'); function button_js() { echo '<script type="text/javascript"> jQuery(document).ready(function(){ jQuery("#sc_select").change(function() { send_to_editor(jQuery("#sc_select :selected").val()); return false; }); }); </script>'; }
10. Удалить номер версии WordPress из шапки
Для некоторых вебмастеров номер версии WordPress – это очень личная информация. Удаление версии WordPress — это еще один способ повысить уровень безопасности вашего сайта. Этот короткий сниппет удалит всю информацию о версии платформы из области шапки на всех страницах.
// remove version info from head and feeds function complete_version_removal() { return ''; } add_filter('the_generator', 'complete_version_removal');
11.Изменить URL результатов поиска в WordPress.
Даже привлекательные постоянные ссылки не обновляют внешний вид ссылок результатов поиска. К счастью этот полезный снипет может решить проблему, приводя ссылки к виду /search/ключи+ тип структуры URL
function fb_change_search_url_rewrite() { if ( is_search() && ! empty( $_GET['s'] ) ) { wp_redirect( home_url( "/search/" ) . urlencode( get_query_var( 's' ) ) ); exit(); } } add_action( 'template_redirect', 'fb_change_search_url_rewrite' );
12. Увеличение резкости при изменении размера изображения
Не важно, насколько четким было загруженное изображение, кажется, что WordPress всегда каким-то образом делает его миниатюру более размытой. Данный PHP-сниппет преобразит функцию изменения размеров изображений таким образом, что резкость миниатюр будет увеличиваться автоматически.
function ajx_sharpen_resized_files( $resized_file ) { $image = wp_load_image( $resized_file ); if ( !is_resource( $image ) ) return new WP_Error( 'error_loading_image', $image, $file ); $size = @getimagesize( $resized_file ); if ( !$size ) return new WP_Error('invalid_image', __('Could not read image size'), $file); list($orig_w, $orig_h, $orig_type) = $size; switch ( $orig_type ) { case IMAGETYPE_JPEG: $matrix = array( array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1), ); $divisor = array_sum(array_map('array_sum', $matrix)); $offset = 0; imageconvolution($image, $matrix, $divisor, $offset); imagejpeg($image, $resized_file,apply_filters( 'jpeg_quality', 90, 'edit_image' )); break; case IMAGETYPE_PNG: return $resized_file; case IMAGETYPE_GIF: return $resized_file; } return $resized_file; } add_filter('image_make_intermediate_size', 'ajx_sharpen_resized_files',900);
13. Удаление миниатюр изображений по умолчанию
Когда вы загружаете новое изображение, WordPress автоматически обрезает некоторое количество дополнительных миниатюр. Отключив эту функцию, вы снимите часть нагрузки с сервера и сохраните пространство на жестком диске. Некоторым нравится иметь разделенные миниатюры, но в этом часто нет нужды, особенно, если вы пытаетесь сохранить место для бэкапов сайта
update_option( 'thumbnail_size_h', 0 ); update_option( 'thumbnail_size_w', 0 ); update_option( 'medium_size_h', 0 ); update_option( 'medium_size_w', 0 ); update_option( 'large_size_h', 0 ); update_option( 'large_size_w', 0 );
14. Поменять базовый URL автора
Вы наверняка знаете, что архив автора лежит по адресу /author/username/. Структура остальных постоянных ссылок легко настраивается, но в силу некоторых причин базовая ссылка автора требует определенных танцев с бубнами. Я надеюсь, что данный сниппет, поможет озадаченным разработчикам найти решение этой проблемы.
add_action('init', 'cng_author_base'); function cng_author_base() { global $wp_rewrite; $author_slug = 'profile'; // change slug name $wp_rewrite->author_base = $author_slug; }
15. Вывести ID страницы/записи в таблицах в админке
Как часто вам приходилось разыскивать ID определенной страницы? Этот сниппет включит ID прямо в таблицу записей или страниц. Это займет немного места, но при необходимости лишние колонки всегда можно удалить.
add_filter('manage_posts_columns', 'posts_columns_id', 5); add_action('manage_posts_custom_column', 'posts_custom_id_columns', 5, 2); add_filter('manage_pages_columns', 'posts_columns_id', 5); add_action('manage_pages_custom_column', 'posts_custom_id_columns', 5, 2); function posts_columns_id($defaults){ $defaults['wps_post_id'] = __('ID'); return $defaults; } function posts_custom_id_columns($column_name, $id){ if($column_name === 'wps_post_id'){ echo $id; } }
16. Включение SSL/HTTPS для страниц с определенными ID
Для страниц оформления заказа или страниц регистрации/авторизации вы можете захотеть использовать HTTPS в качестве заголовка запроса. Это можно сделать, отредактировав файл .htaccess, но также есть возможность, добиться тех же результатов, используя PHP-сниппет. Убедитесь в том, что вы уже создали нужные страницы и у вас есть SSL-лицензия для вашего домена.
function wps_force_ssl( $force_ssl, $post_id = 0, $url = '' ) { if ( $post_id == 25 ) { return true } return $force_ssl; } add_filter('force_ssl' , 'wps_force_ssl', 10, 3);
17. Автоматическая генерация ссылок в формате Twitter @упоминание
Если вы часто упоминаете Twitter-аккаунты в ваших записях, то вы просто влюбитесь в этот полезный сниппет. Где бы в записи не встречалось имя пользователя в формате @username, HTML будет преобразован в ссылку на профиль в Twitter. Чудесная штучка, да?
function content_twitter_mention($content) { return preg_replace('/([^a-zA-Z0-9-_&])@([0-9a-zA-Z_]+)/', "$1<a href=\"http://twitter.com/$2\" target=\"_blank\" rel=\"nofollow\">@$2</a>", $content); } add_filter('the_content', 'content_twitter_mention'); add_filter('comment_text', 'content_twitter_mention');
18. Убрать кнопки загрузки медиа-файлов
В некоторых случаях ваши авторы или редакторы не только знают, как загружать изображения вручную, но и предпочитают делать это именно так. Этот кусок кода уберет всплывающее окно для вставки медиафайлов, чтоб позволит отображать только самые нужные элементы. С этим кодом можно поиграть и посмотреть, как его работа отобразится на интерфейсе загрузки медиафайлов.
function myAttachmentFields($form_fields, $post) { // Can now see $post becaue the filter accepts two args, as defined in the add_fitler if ( substr( $post->post_mime_type, 0, 5 ) == 'image' ) { $form_fields['image_alt']['value'] = ''; $form_fields['image_alt']['input'] = 'hidden'; $form_fields['post_excerpt']['value'] = ''; $form_fields['post_excerpt']['input'] = 'hidden'; $form_fields['post_content']['value'] = ''; $form_fields['post_content']['input'] = 'hidden'; $form_fields['url']['value'] = ''; $form_fields['url']['input'] = 'hidden'; $form_fields['align']['value'] = 'aligncenter'; $form_fields['align']['input'] = 'hidden'; $form_fields['image-size']['value'] = 'thumbnail'; $form_fields['image-size']['input'] = 'hidden'; $form_fields['image-caption']['value'] = 'caption'; $form_fields['image-caption']['input'] = 'hidden'; $form_fields['buttons'] = array( 'label' => '', 'value' => '', 'input' => 'html' ); $filename = basename( $post->guid ); $attachment_id = $post->ID; if ( current_user_can( 'delete_post', $attachment_id ) ) { if ( !EMPTY_TRASH_DAYS ) { $form_fields['buttons']['html'] = "<a href='" . wp_nonce_url( "post.php?action=delete&smp;amp;post=$attachment_id", 'delete-attachment_' . $attachment_id ) . "' id='del[$attachment_id]' class='delete'>" . __( 'Delete Permanently' ) . '</a>'; } elseif ( !MEDIA_TRASH ) { $form_fields['buttons']['html'] = "<a href='#' class='del-link' onclick="document.getElementById('del_attachment_$attachment_id').style.display='block';return false;">" . __( 'Delete' ) . "</a> <div id='del_attachment_$attachment_id' class='del-attachment' style='display:none;'>" . sprintf( __( 'You are about to delete <strong>%s</strong>.' ), $filename ) . " <a href='" . wp_nonce_url( "post.php?action=delete&post=$attachment_id", 'delete-attachment_' . $attachment_id ) . "' id='del[$attachment_id]' class='button'>" . __( 'Continue' ) . "</a> <a href='#' class='button' onclick="this.parentNode.style.display='none';return false;">" . __( 'Cancel' ) . "</a> </div>"; } else { $form_fields['buttons']['html'] = "<a href='" . wp_nonce_url( "post.php?action=trash&post=$attachment_id", 'trash-attachment_' . $attachment_id ) . "' id='del[$attachment_id]' class='delete'>" . __( 'Move to Trash' ) . "</a><a href='" . wp_nonce_url( "post.php?action=untrash&post=$attachment_id", 'untrash-attachment_' . $attachment_id ) . "' id='undo[$attachment_id]' class='undo hidden'>" . __( 'Undo' ) . "</a>"; } } else { $form_fields['buttons']['html'] = ''; } } return $form_fields; } // Hook on after priority 10, because WordPress adds a couple of filters to the same hook - added accepted args(2) add_filter('attachment_fields_to_edit', 'myAttachmentFields', 11, 2 );
19. Кеширование запросов с помощью Transient API
Это фантастический сниппет для кэширования любых WordPress-запросов с использованием Transient API. Это новая функциональность, которая позволяет разработчикам выдергивать из базы данных только определенные запросы и кешировать их независимо от страниц и записей. Вы можете найти множество великолепных инструкций, объясняющих, как использовать этот API, и зачем он вам вообще нужен.
// Get any existing copy of our transient data if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) { // It wasn't there, so regenerate the data and save the transient $special_query_results = new WP_Query( 'cat=5&order=random&tag=tech&post_meta_key=thumbnail' ); set_transient( 'special_query_results', $special_query_results ); } // Use the data like you would have normally...
20. Запускать все скрипты в wp_footer()
Если вы занимаетесь ускорением вашего сайта, то, возможно, вы захотите расположить все JS-скрипты ниже основного HTML-кода вашей страницы. Такой трюк позволяет завершить загрузку большего количества частей DOM до запуска любых динамичных скриптов. Данный сниппет вряд ли пригодится всем и каждому, но он может ускорить WordPress-сайты для обычных пользователей.
if(!is_admin()){ remove_action('wp_head', 'wp_print_scripts'); remove_action('wp_head', 'wp_print_head_scripts', 9); remove_action('wp_head', 'wp_enqueue_scripts', 1); add_action('wp_footer', 'wp_print_scripts', 5); add_action('wp_footer', 'wp_enqueue_scripts', 5); add_action('wp_footer', 'wp_print_head_scripts', 5); }
21.Создать уникальные роли WordPress-пользователей
Вам когда-нибудь хотелось иметь на сайте роль, которая выше «Редактора», но ниже «Администратора»? Или возможно дать одному из ваших авторов какое-либо преимущество, но не делать его при этом редактором всего сайта?
Данный сниппет запускается единожды, после чего изолируется или удаляется. Этот код впрыснет новую роль пользователя в базу данных WordPress, а также определит для нее все уникальные привилегии.
// To add the new role, using 'international' as the short name and // 'International Blogger' as the displayed name in the User list and edit page: /* add_role('international', 'International Blogger', array( 'read' => true, // True allows that capability, False specifically removes it. 'edit_posts' => true, 'delete_posts' => true, 'edit_published_posts' => true, 'publish_posts' => true, 'edit_files' => true, 'import' => true, 'upload_files' => true //last in array needs no comma! )); */ // To remove one outright or remove one of the defaults: /* remove_role('international'); */
22.Заблокировать консоль для всех кроме администраторов
Если на вашем сайте разрешена регистрация, но вы не хотите, чтоб кто-то из новых пользователей имел доступ к серверной части сайта, то это сниппет избавит вас от потенциальной головной боли.
Данный сниппет очень полезен, если вы хотите дать пользователям возможность регистрироваться, но не желаете открывать доступ к консоли. Все кроме администратора будут автоматически перенаправляться на домашнюю страницу
add_action( 'init', 'blockusers_init' ); function blockusers_init() { if ( is_admin() && ! current_user_can( 'administrator' ) ) { wp_redirect( home_url() ); exit; } }
23. Авторизация с помощью Username или E-mail
Если вы ищите что-то, что существенно улучшит WP-функциональность, то ваши поиски здесь заканчиваются. Большинство социальных сетей дают пользователям возможность заходить на сайт с помощью логина или e-mail-адреса. WordPress не имеет этой функции по умолчанию, но ее можно быстро добавить, не прикладывая к этому особых усилий.
function login_with_email_address($username) { $user = get_user_by('email',$username); if(!empty($user->user_login)) $username = $user->user_login; return $username; } add_action('wp_authenticate','login_with_email_address'); function change_username_wps_text($text){ if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){ if ($text == 'Username'){$text = 'Username / Email';} } return $text; } add_filter( 'gettext', 'change_username_wps_text' );
24. Выключить ссылки в комментариях
По умолчанию вокруг любого текста, введенного в поле для комментария и содержащего http:// автоматически формируется якорная ссылка. Такие гипер-ссылки обычно не представляют большой проблемы, но вам могут довольно сильно докучать спаммеры. Благодаря этому сниппету все ссылки в комментариях остаются обычным текстом. Кажется, что такая функция должна быть встроена в WordPress по умолчанию, но ее не сложно добавить самостоятельно, так как это всего лишь одна строка PHP-кода.
remove_filter('comment_text', 'make_clickable', 9);
25. Удалить ненужные элементы из консоли
Если вы, как и я, предпочитаете чистый интерфейс без лишних элементов, то этот сниппет для вас. Консоль WordPress включает множество всяких ненужностей, типа новостей, последних плагинов, быстрых записей и всего прочего. Данный PHP-код позволит вам убрать любые нежелательные включения из панели управления
add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets'); function my_custom_dashboard_widgets() { global $wp_meta_boxes; //Right Now - Comments, Posts, Pages at a glance unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']); //Recent Comments unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']); //Incoming Links unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']); //Plugins - Popular, New and Recently updated WordPress Plugins unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']); //Wordpress Development Blog Feed unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']); //Other WordPress News Feed unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']); //Quick Press Form unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']); //Recent Drafts List unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']); }
Специально для читателей WPNICE перевод с сайта managewp.com
Друзья! Я понимаю что это перевод. Но возможно вы всё равно понимаете как работают все эти функции.
Вопрос по коду №22 — Заблокировать консоль для всех, кроме администратора.
Код отлично работает! Но возникла загвоздка! Пользователь с правами редактора, которого я использую чтобы постить статьи и не палить логин администратора, не может теперь войти в консоль!
Это логично, потому что он не является if ( is_admin() && ! current_user_can( ‘administrator’ )!
Но как теперь написать такой же код и для редактора? Типа if ( is_editor() && ! current_user_can…
Что там дальше написать?? ))