
Создаем сайт для клиента на WP. Полезные хуки, плагины и доработки по сайту
- Статистика 2325 2
- Автор: admin
- Раздел: CMS WordPress
- Комментарии: Комментариев нет

Начало статьи как упростить и улучшить админ панель — мы уже публиковали. Здесь продолжение.
Несколько полезных хуков для файла functions.php
Отключение Админ-бара
1 2 |
add_filter('show_admin_bar', '__return_false'); // отключить add_filter('show_admin_bar', '__return_true'); // включить |
Все настройки сайта на одной странице
1 2 3 4 5 |
## Добавляет ссылку на страницу всех настроек в пункт меню админки "Настройки" add_action('admin_menu', 'all_settings_link'); function all_settings_link(){ add_options_page( __('All Settings'), __('All Settings'), 'manage_options', 'options.php'); } |
Удаление метабоксов на странице редактирования записи
На странице редактирования записи очень часто находятся никогда не используемые метабоксы. И чтобы немного ускорить админку и убрать лишнее из интерфейса, их можно удалить.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
## Удаление метабоксов на странице редактирования записи add_action('admin_menu','remove_default_post_screen_metaboxes'); function remove_default_post_screen_metaboxes() { // для постов remove_meta_box( 'postcustom','post','normal' ); // произвольные поля remove_meta_box( 'postexcerpt','post','normal' ); // цитата remove_meta_box( 'commentstatusdiv','post','normal' ); // комменты remove_meta_box( 'trackbacksdiv','post','normal' ); // блок уведомлений remove_meta_box( 'slugdiv','post','normal' ); // блок альтернативного названия статьи remove_meta_box( 'authordiv','post','normal' ); // автор // для страниц remove_meta_box( 'postcustom','page','normal' ); // произвольные поля remove_meta_box( 'postexcerpt','page','normal' ); // цитата remove_meta_box( 'commentstatusdiv','page','normal' ); // комменты remove_meta_box( 'trackbacksdiv','page','normal' ); // блок уведомлений remove_meta_box( 'slugdiv','page','normal' ); // блок альтернативного названия статьи remove_meta_box( 'authordiv','page','normal' ); // автор } |
Добавляет миниатюры записи в таблицу записей в админке
Он работает автоматически для всех типов записей. Но если миниатюра нужна на конкретных, то раскомментируйте строку в коде и укажите типы записей для которых нужно выводить миниатюру.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
## Добавляет миниатюры записи в таблицу записей в админке if(1){ add_action('init', 'add_post_thumbs_in_post_list_table', 20 ); function add_post_thumbs_in_post_list_table(){ // проверим какие записи поддерживают миниатюры $supports = get_theme_support('post-thumbnails'); // $ptype_names = array('post','page'); // указывает типы для которых нужна колонка отдельно // Определяем типы записей автоматически if( ! isset($ptype_names) ){ if( $supports === true ){ $ptype_names = get_post_types(array( 'public'=>true ), 'names'); $ptype_names = array_diff( $ptype_names, array('attachment') ); } // для отдельных типов записей elseif( is_array($supports) ){ $ptype_names = $supports[0]; } } // добавляем фильтры для всех найденных типов записей foreach( $ptype_names as $ptype ){ add_filter( "manage_{$ptype}_posts_columns", 'add_thumb_column' ); add_action( "manage_{$ptype}_posts_custom_column", 'add_thumb_value', 10, 2 ); } } // добавим колонку function add_thumb_column( $columns ){ // подправим ширину колонки через css add_action('admin_notices', function(){ echo ' <style> .column-thumbnail{ width:80px; text-align:center; } </style>'; }); $num = 1; // после какой по счету колонки вставлять новые $new_columns = array( 'thumbnail' => __('Thumbnail') ); return array_slice( $columns, 0, $num ) + $new_columns + array_slice( $columns, $num ); } // заполним колонку function add_thumb_value( $colname, $post_id ){ if( 'thumbnail' == $colname ){ $width = $height = 45; // миниатюра if( $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true ) ){ $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true ); } // из галереи... elseif( $attachments = get_children( array( 'post_parent' => $post_id, 'post_mime_type' => 'image', 'post_type' => 'attachment', 'numberposts' => 1, 'order' => 'DESC', ) ) ){ $attach = array_shift( $attachments ); $thumb = wp_get_attachment_image( $attach->ID, array($width, $height), true ); } echo empty($thumb) ? ' ' : $thumb; } } } |
Отключаем пинги на свои записи
Когда публикуется запись со ссылкой в тексте на другую запись вашего же сайта у которой включена возможность получать уведомления, в комментариях появляется пинг — уведомление что запись была процетирована где-то. Это удобно, чтобы видеть что на вашу запись кто-то сослался, но когда ссылается ваш сайт на ваш сайт — это нелогично и даже мешает.
1 2 3 4 5 6 7 |
## Отключаем пинги на свои же посты add_action('pre_ping', 'kama_disable_inner_ping'); function kama_disable_inner_ping( &$links ){ foreach( $links as $k => $val ) if( false !== strpos( $val, str_replace('www.', '', $_SERVER['HTTP_HOST']) ) ) unset( $links[$k] ); } |
Авто-удаление license.txt и readme.html
В основном каталоге WordPress есть эти два файла. Их может открыть кто угодно и так определить работает сайт на WordPress и какая именно версия используется.
Этот код будет отличным дополнением к плагину Clearfy.
Как работает? Проверяет наличие файла, когда вы заходите в админку. Если файл есть, то PHP пытается его удалить автоматически. Если для удаления недостаточно прав, то админ увидит сообщение о том, что нужно удалить файлы license.txt и readme.html.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
## Удаление файлов license.txt и readme.html для защиты if( is_admin() && ! defined('DOING_AJAX') ){ $license_file = ABSPATH .'/license.txt'; $readme_file = ABSPATH .'/readme.html'; if( file_exists($license_file) && current_user_can('manage_options') ){ $deleted = unlink($license_file) && unlink($readme_file); if( ! $deleted ) $GLOBALS['readmedel'] = 'Не удалось удалить файлы: license.txt и readme.html из папки `'. ABSPATH .'`. Удалите их вручную!'; else $GLOBALS['readmedel'] = 'Файлы: license.txt и readme.html удалены из из папки `'. ABSPATH .'`.'; add_action( 'admin_notices', function(){ echo ' '. $GLOBALS['readmedel'] .' '; } ); } } |
Как скрыть сообщение об обновлении WordPress?
1 2 3 4 5 6 7 8 |
//отключение сообщения об обновлении start function del_upgrade_nag() { echo '<style type="text/css"> .update-nag {display: none} </style>'; } add_action('admin_head', 'del_upgrade_nag'); //отключение сообщения об обновлении end |
Данный код скроет только сообщение об обновлении и ничего больше. Вы по-прежнему сможете в любой момент обновить вашу версию WordPress через меню «Консоль\Обновления»
Как отключить обновление плагинов?
1 2 3 4 5 6 7 8 |
//отключение обновления плагинов start function disable_updates($value) { unset($value->response['akismet/akismet.php']); unset($value->response['all-in-one-seo-pack/all_in_one_seo_pack.php']); return $value; } add_filter('site_transient_update_plugins', 'disable_updates'); //отключение обновления плагинов end |
Этот код отключит проверку на наличие обновлений для указанных плагинов (надо указать папку плагина и его главный файл).
Как разместить рекламу в середине записи?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//добавляем рекламу в середину записи start function wph_add_adsense_in_middle($content) { if ( !is_single() ) return $content; $content = explode("</p>", $content); $middlep = round( (count($content) - 1) / 2 ); $new_content = ''; for ($i = 0; $i < ( count($content)-1 ); $i++) { $new_content .= $content[$i] . "</p>"; if ($i + 1 == $middlep) { $new_content .= '<p>'; $new_content .= 'тут ваш скрипт эдсенса'; $new_content .= '</p>'; } } return $new_content; } add_filter('the_content', 'wph_add_adsense_in_middle'); //добавляем рекламу в середину записи end |
Как вывести на странице список всех записей сайта?
Вывести список всех записей можно с помощью небольшого шорткода [allposts], который вы вольны добавить куда угодно. Совсем недавно я рассматривал вопрос о том, как вывести список всех меток или рубрик сайта в алфавитном порядке, с записями принцип практически тот же. Для этого вам необходимо добавить в файл functions.php
вашей темы следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//вывод списка всех записей сайта с помощью шорткода start function wph_allposts_shortcode($atts, $content) { $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1, 'orderby' => 'title', 'order' => 'ASC' ); $query = new WP_Query( $args ); if( $query->have_posts() ) { echo '<ul class="allposts">'; while ( $query->have_posts() ) { $query->the_post(); echo '<li><a href="'.get_the_permalink().'">' . get_the_title() . '</a></li>'; } echo '</ul>'; } wp_reset_postdata(); } add_shortcode('allposts', 'wph_allposts_shortcode'); //вывод списка всех записей сайта с помощью шорткода end |
При желании вы можете поправить аргументы WP_Query, если вам надо получить список записей с какими-либо дополнительными условиями (фильтрация по рубрикам, датам и т.д.). По умолчанию шорткод выведет список в алфавитном порядке.
Как выводить разное количество записей в разных рубриках?
WordPress позволяет настроить количество записей, выводимых на страницах вашего сайта. С одной оговоркой — это общая настройка, которая касается вывода всех рубрик (и главной страницы сайта). Если же вы хотите выводить разное количество записей в разных рубриках, то вам придется использовать следующий код, который вам необходимо добавить в файл functions.php
вашей темы:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//произвольное число записей в рубриках start function wph_custom_posts_per_page($query) { if (!is_admin() && $query->is_main_query()) { if ($query->is_category('news')) { $query->set('posts_per_page', 2); } if ($query->is_category('posts')) { $query->set('posts_per_page', 3); } } } add_action('pre_get_posts', 'wph_custom_posts_per_page'); //произвольное число записей в рубриках end |
Где 'news' и 'posts' это ярлыки рубрик, а '2' и '3' это число записей, которое будет выводиться в этих рубриках.
Как скрыть фразу «Спасибо вам за творчество с WordPress»?
1 2 3 4 5 6 |
//свой текст в футере админки start function wph_admin_footer_text () { echo '<i>Это мой текст в футере админки!</i> '; } add_filter('admin_footer_text', 'wph_admin_footer_text'); //свой текст в футере админки end |
Как изменить иконку favicon в админке сайта?
1 2 3 4 5 6 |
//отдельная favicon иконка для админки start function admin_favicon() { echo ''; } add_action('admin_head', 'admin_favicon'); //отдельная favicon иконка для админки end |
Как автоматически «сжимать» html, css и js скрипты сайта?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
//сжатие html, js и css start class Compress_HTML { protected $compress_css = true; //сжатие css (true - включено) protected $compress_js = true; //сжатие js-скриптов (true - включено) protected $info_comment = true; //вывод информации о сжатии (было - стало) protected $remove_comments = true; //комментарии в коде protected $html; public function __construct($html) {if (!empty($html)){$this->parseHTML($html);}} public function __toString() {return $this->html;} protected function bottomComment($raw, $compressed){ $raw = strlen($raw); $compressed = strlen($compressed); $savings = ($raw-$compressed) / $raw * 100; $savings = round($savings, 2); return '<!--HTML compressed, size saved '.$savings.'%. From '.$raw.' bytes, now '.$compressed.' bytes-->';} protected function minifyHTML($html){ $pattern = '/<(?<script>// <![CDATA[ script).*?<\/script\s*>|<(?<br /> <br /> <style>style).*?<\/style\s*>|<!(?<comment>--).*?-->|<(?<tag>[\/\w.:-]*)(?:".*?"|\'.*?\'|[^\'">]+)*>|(?<text>((<[^!\/\w.:-])?[^<]*)+)|/si'; preg_match_all($pattern, $html, $matches, PREG_SET_ORDER); $overriding = false; $raw_tag = false; $html = ''; foreach ($matches as $token) { $tag = (isset($token['tag'])) ? strtolower($token['tag']) : null; $content = $token[0]; if (is_null($tag)){ if ( !empty($token['script']) ){$strip = $this->compress_js; } else if ( !empty($token['style']) ) {$strip = $this->compress_css; } else if ($content == '<!--wp-html-compression no compression-->') {$overriding = !$overriding; continue;} else if ($this->remove_comments) {if (!$overriding && $raw_tag != 'textarea'){ $content = preg_replace('/<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->/s', '', $content);}} } else{ if ($tag == 'pre' || $tag == 'textarea'){$raw_tag = $tag;} else if ($tag == '/pre' || $tag == '/textarea') {$raw_tag = false;} else{if ($raw_tag || $overriding){$strip = false;}else{$strip = true; $content = preg_replace('/(\s+)(\w++(?<!\baction|\balt|\bcontent|\bsrc)="")/', '$1', $content); $content = str_replace(' />', '/>', $content);}}} if ($strip){$content = $this->removeWhiteSpace($content);} $html .= $content;} return $html;} public function parseHTML($html) { $this->html = $this->minifyHTML($html); if ($this->info_comment){$this->html .= "\n" . $this->bottomComment($html, $this->html);}} protected function removeWhiteSpace($str) { $str = str_replace("\t", ' ', $str); $str = str_replace("\n", '', $str); $str = str_replace("\r", '', $str); while (stristr($str, ' ')){$str = str_replace(' ', ' ', $str);} return $str;} } function wp_html_compression_finish($html){return new Compress_HTML($html);} function wp_html_compression_start(){ob_start('wp_html_compression_finish');} add_action('get_header', 'wp_html_compression_start'); //сжатие html, js и css end |
Как защититься от спама с помощью подмены полей?
Предлагаю вам воспользоваться уже давно известным и проверенным способом защиты от спама через подмену полей. В чем он заключается? В создании дополнительного поля для ввода комментария с одновременным скрытием стандартного поля. Спам-скрипты пытаются заполнить скрытое стандартное поле с именем 'comment' и в результате не проходят проверку. Данный способ с подменой полей успешно работает уже более 10 лет, так как спаммерам лень писать «умные» скрипты, которые могли бы изображать из себя реального человека. Для этого вам необходимо добавить в файл functions.php вашей темы следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//добавляем поле 'real-comment' start function wph_add_new_comment_field($args) { if (preg_match('/<textarea.*textarea>/', $args['comment_field'], $match)){ $textarea = $match[0]; $real_textarea = str_replace('comment', 'real-comment', $textarea, $count); if ($count) { $hidden_textarea = str_replace( '<textarea', '<textarea style="display:none;"', $textarea ); $hidden_textarea = str_replace( 'required="required"', '', $hidden_textarea ); $hidden_textarea = str_replace( 'aria-required="true"', '', $hidden_textarea ); $args['comment_field'] = str_replace($textarea, "$hidden_textarea$real_textarea", $args['comment_field']); } } return $args; } add_filter('comment_form_defaults', 'wph_add_new_comment_field', 30); //добавляем поле 'real-comment' end //проверка на спам start function wph_verify_spam() { if(false === strpos($_SERVER['REQUEST_URI'], 'wp-comments-post.php')) return; if(!empty($_POST['comment'])) wp_die('Спаму нет!'); $_POST['comment'] = $_POST['real-comment']; } add_filter('init', 'wph_verify_spam'); //проверка на спам end |
Как отключить все архивы на сайте кроме «Рубрик» и «Меток»?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//отключение всех архивов кроме рубрик и меток start function wph_disable_all_archives($false) { if (is_archive() and !is_category() and !is_tag()) { global $wp_query; $wp_query->set_404(); status_header( 404 ); nocache_headers(); return true; } return $false; } //удаление ссылки на архив автора function wph_remove_author_link($content) {return home_url();} add_action('pre_handle_404', 'wph_disable_all_archives'); add_filter('author_link', 'wph_remove_author_link'); //отключение всех архивов кроме рубрик и меток end |
Как запретить индексацию страниц с 404 ошибкой?
Запретить индексацию страниц с 404 ошибкой (не найдено) можно либо с помощью SEO-плагинов, либо с помощью небольшого кода, который вам необходимо добавить в файл functions.php вашей темы:
1 2 3 4 5 6 7 8 |
//запрет индексирования страниц с ошибкой 404 start function wph_noindex_for_404() { if( is_404() ) { echo '<meta name="robots" content="noindex, follow" />'.PHP_EOL; } } add_action('wp_head', 'wph_noindex_for_404'); //запрет индексирования страниц с ошибкой 404 end |
Как изменить префикс author для авторов сайта?
Где «profile» это новый префикс для авторов. Так же после добавления этого кода вам необходимо зайти в «Настройки\Постоянные ссылки» и нажать кнопку «Сохранить изменения» (ничего менять в настройках не требуется) — только после этого новый префикс для авторов начнет работать на вашем сайте.
1 2 3 4 5 6 7 8 |
//смена префикса для авторов start function wph_author_base() { global $wp_rewrite; $author_slug = 'profile'; $wp_rewrite->author_base = $author_slug; } add_action('init', 'wph_author_base'); //смена префикса для авторов end |
Как запретить пользователям входить в админку?
Если по каким-то причинам вы не хотите, чтобы пользователи сайта могли входить в админку (любые ссылки в wp-admin), то сделать это очень просто. Достаточно лишь добавить в файл functions.php вашей темы следующий код:
1 2 3 4 5 6 7 8 |
//запрет доступа к админке start function wph_noadmin() { if (is_admin() && !current_user_can('administrator')) { wp_redirect(home_url()); exit; } } add_action('init', 'wph_noadmin'); //запрет доступа к админке end |
Как подключить шрифты от Google вроде Open Sans и Roboto?
При выборе шрифтов на сайте Google Fonts вам будет предложено использовать для подключения выбранного шрифта код вида <link rel="stylesheet" href="" >
. Но в WordPress подключение шрифтов таким образом является неправильным. Разработчики движка рекомендуют использовать специальные функции для регистрации и подключения css-стилей, поэтому именно ими вам и стоит воспользоваться. Покажу на примере подключения двух гугловских шрифтов — Open Sans и Roboto. Добавьте в файл functions.php вашей темы следующий код:
1 2 3 4 5 6 7 8 9 10 11 |
//подключение шрифтов Open Sans и Roboto от Google start function wph_add_google_fonts() { if ( !is_admin() ) { wp_register_style('google-open-sans', 'https://fonts.googleapis.com/css?family=Open+Sans:400,700&subset=cyrillic', array(), null, 'all'); wp_register_style('google-roboto', 'https://fonts.googleapis.com/css?family=Roboto:400,700&subset=cyrillic', array(), null, 'all'); wp_enqueue_style('google-open-sans'); wp_enqueue_style('google-roboto'); } } add_action('wp_enqueue_scripts', 'wph_add_google_fonts'); //подключение шрифтов Open Sans и Roboto от Google end |
Как использовать эти шрифты для отдельных кусков текста в записи? Очень просто:
1 2 3 |
<span style="font-family: 'Open Sans';">В данной строчке текста используется шрифт <strong>Open Sans</strong>.</span> <span style="font-family: 'Roboto';">В данной строчке текста используется шрифт <strong>Roboto</strong>.</span> <span style="font-family: Times New Roman;">В данной строчке текста используется шрифт <strong>Times New Roman</strong>.</span> |
Но лучше, конечно, сразу прописать используемый шрифт для всех тегов параграфа в файле style.css
Как вывести форму поиска с помощью шорткода?
В движке нет стандартного способа вывести форму поиска в контенте записи или страницы. Но не беда, форму поиска можно засунуть в шорткод, который можно будет вставить в любое нужное вам место. Для этого вам необходимо добавить в файл functions.php
вашей темы следующий код:
1 2 3 4 5 6 |
//вывод стандартной формы поиска шорткодом start function wph_display_search_form() { return get_search_form(false); } add_shortcode('search_form', 'wph_display_search_form'); //вывод стандартной формы поиска шорткодом end |
Для использования шорткода просто вставьте в контент записи или страницы [search_form]
— будет выведена стандартная для темы форма поиска (если в теме она есть). В случае, если внешний вид прописанной в теме формы поиска вас не устраивает, то вы можете его кастомизировать. Например, так:
1 2 3 4 5 6 7 8 9 10 11 12 |
//вывод кастомизированной формы поиска шорткодом start function wph_display_search_form() { $search_form = '<br /> <br /> <form method="get" id="search-form-alt" action="'. esc_url(home_url('/')) .'"><input type="text" name="s" id="s" placeholder="Введите искомое слово..."></form> <p> <p>'; return $search_form; } add_shortcode('search_form', 'wph_display_search_form'); //вывод кастомизированной формы поиска шорткодом end |
Полезные плагины для сайта WP
— WPML (мультиязычие сайта)
— Admin Menu Editor (изменение пунктов меню в админ панели сайта)
— All In One SEO Pack (полезный плагин для продвижения сайта)
— All In One WP Security (защита сайта)
— Contact Form 7 (формы обратной связи)
— Google Captcha (reCAPTCHA) by BestWebSoft (Google reCAPTCHA)
— Google XML Sitemap Generator (автоматическая карта сайта)
— RusToLat — автоматические ЧПУ на английском
Очень благодарны сайтам: Источник 1, источник 2
Отправить ответ