Привет! Сегодня я расскажу об одной очень интересной возможности WordPress, о которой многие не знают, и не все пользуются. Речь идёт о шорткодах (shortcode). Также я приведу примеры десяти полезных шорткодов, которые можно использовать вместо плагинов.
Что такое шорткоды?
Шорткоды поддерживаются всеми версиями вордпресса, начиная с 2.5. Они представляют собой кодовое слово, написав которое в редакторе поста, вы вызовете специальную функцию. Намного проще это показать на примере, чем объяснить. Один из стандартных шорткодов это [gallery]
. Он выводит галерею из изображений, загруженных при написании поста.
Как использовать шорткоды?
Дополнительные шорткоды, не входящие в вордпресс “из коробки”, написаны вручную и вызываются из файла functions.php. Самый простой пример такого шорткода – вывод текущего года внутри текста поста:
В файле functions.php в удобном месте (например внизу) дописываем код:
1 2 3 4 |
function show_current_year(){ return date('Y'); } add_shortcode('show_current_year', 'show_current_year'); |
Теперь, вставив в тексте поста [show_current_year]
, мы получим значение текущего года.
С шорткодами возможно использовать атрибуты. Например [gallery exclude="32"]
выведет все картинки из галереи, за исключением картинки с ID=32
Если же вы хотите использовать шорткоды вне текста поста, например, в текстовых виджетах, то в functions.php необходимо прописать следующее (один раз, не надо писать для каждой функции шорткода отдельно):
1 |
add_filter('widget_text', 'do_shortcode'); |
Чтобы разрешить шорткоды в анонсах, надо дополнительно дописать:
1 |
add_filter('the_excerpt', 'do_shortcode'); |
Если вы хотя бы немного знаете php, то написать простой шорткод самостоятельно не составит большого труда 🙂
Ниже я предлагаю небольшую коллекцию шорткодов wordpress. Чтобы их использовать, необходимо дописать внизу файла functions.php новую функцию, а в тексте записи или виджета вставить нужный шорткод.
1. Отображать текст только в RSS
Если выводить часть записи только в RSS ленте, это будет стимулировать рост количества подписчиков. Шорткод является отличной заменой для плагина FeedOnly.
1 2 3 4 5 |
function feedonly_shortcode( $atts, $content = null) { if (!is_feed()) return ""; return $content; } add_shortcode('feedonly', 'feedonly_shortcode'); |
Для использования пишем нужный текст внутри шорткода: [feedonly]текст для подписчиков [/feedonly].
2. Показывать часть поста только зарегистрированным пользователям
То же самое, только с той лишь разницей, что скрытый текст будут видеть зарегистрированные посетители.
1 2 3 4 5 6 |
function member_check_shortcode( $atts, $content = null ) { if ( is_user_logged_in() && !is_null( $content ) && !is_feed() ) return $content; return ''; } add_shortcode( 'member', 'member_check_shortcode' ); |
Используем так: [member]Скрытый текст для пользователей.[/member]
3. Скрытые заметки к посту
Если вы ведете блог не в одиночку, то возможно, захотите, чтобы какую-то часть поста видели только пользователи, которые могут редактировать и писать записи. Используйте этот шорткод. Также может быть полезен, как “записки для себя”.
1 2 3 4 5 6 |
function sc_note( $atts, $content = null ) { if ( current_user_can( 'publish_posts' ) ) return '<div class="note">'.$content.'</div>'; return ''; } add_shortcode( 'note', 'sc_note' ); |
Использование: [note]тут текст[/note]
. Дополнительно можно прописать стили для div class="note"
, чтобы он визуально отличался.
4. Кодируем email
При помощи этого шорткода можно закодировать email html-символами, что поможет защититься от спама.
1 2 3 4 5 |
function munge_mail_shortcode( $atts , $content=null ) { for ($i = 0; $i < strlen($content); $i++) $encodedmail .= "&#" . ord($content[$i]) . ';'; return '<a href="mailto:'.$encodedmail.'">'.$encodedmail.'</a>'; } add_shortcode('mailto', 'munge_mail_shortcode'); |
Использование: [mailto]myemail@example.com[/mailto]
.
5. Вывод статистики блога
Многие любят выводить в сайдбарах статистику блога. Например, сколько постов и комментариев написано. Это можно сдеать без плагина при помощи шорткода.
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
add_shortcode('wcs_count', 'wcs_count_shortcode_handler'); function wcs_count_shortcode_handler($atts) { // extract parameters $parms = shortcode_atts(array( 'type' => 'posts', 'format' => 'true', 'extra' => '1', ), $atts); $type = strtolower($parms['type']); $format = strtolower($parms['format']); $extra = $parms['extra']; // process t/f options $b_format = false; if (($format == 'yes') || ($format == 'y') || ($format == 'true') || ($format == '1')) {$b_format = true;} // exit return wcs_get_count($type, $b_format, $extra); } function wcs_get_count($type='posts', $format='1', $extra='1') { // TYPES: // posts, posts_by_author, pages, tags, categories // users, ms_users, blogroll, blogroll_categories, commenters // comments, comments_pending, comments_spam, comments_pingback // comments_by_user, comments_by_nicename, comments_by_email // comments_per_post // $extra is used with: // posts_by_author, comments_by_user, comments_by_nicename, comments_by_email // comments_per_post // init global $wpdb; $type = strtolower($type); $count = 0; // process switch($type) { case 'posts': // published $count = wp_count_posts('post'); $count = $count->publish; // options: publish, future, draft, pending, private, trash, auto-draft, & inherit break; case 'posts_by_author': // use $extra for user/author id case 'posts_by_user': $query = "SELECT COUNT(*) FROM $wpdb->posts "; $where = "WHERE post_type='post' AND post_status='publish' AND post_author='$extra'"; $count = $wpdb->get_var($query . $where); // alternative method is: count_user_posts() break; case 'pages': // published $count = wp_count_posts('page'); $count = $count->publish; break; case 'tags': $count = wp_count_terms('post_tag'); break; case 'categories': $count = wp_count_terms('category'); break; case 'users': $count = count_users(); $count = $count['total_users']; break; case 'ms_users': // multi-site $count = get_user_count(); break; case 'blogroll': $query = "SELECT COUNT(*) FROM $wpdb->links "; $where = "WHERE link_visible='Y'"; $count = $wpdb->get_var($query . $where); break; case 'blogroll_categories': $count = wp_count_terms('link_category'); break; case 'commenters': $query = "SELECT COUNT(DISTINCT comment_author) FROM $wpdb->comments "; $where = "WHERE comment_approved='1' AND comment_type=''"; $count = $wpdb->get_var($query . $where); break; case 'comments': $query = "SELECT COUNT(*) FROM $wpdb->comments "; $where = "WHERE comment_approved='1' AND comment_type=''"; $count = $wpdb->get_var($query . $where); break; case 'comments_pending': $query = "SELECT COUNT(*) FROM $wpdb->comments "; $where = "WHERE comment_approved='0' AND comment_type=''"; $count = $wpdb->get_var($query . $where); break; case 'comments_spam': $query = "SELECT COUNT(*) FROM $wpdb->comments "; $where = "WHERE comment_approved='spam' AND comment_type=''"; $count = $wpdb->get_var($query . $where); break; case 'comments_pingback': case 'comments_pingbacks': case 'comments_trackback': case 'comments_trackbacks': $query = "SELECT COUNT(*) FROM $wpdb->comments "; $where = "WHERE comment_approved='1' AND comment_type='pingback'"; $count = $wpdb->get_var($query . $where); break; case 'comments_by_user': // use $extra for user_id $query = "SELECT COUNT(*) FROM $wpdb->comments "; $where = "WHERE comment_approved='1' AND comment_type='' AND user_id='$extra'"; $count = $wpdb->get_var($query . $where); break; case 'comments_by_author': // use $extra for author nicename (case INsensitive) case 'comments_by_nicename': $query = "SELECT COUNT(*) FROM $wpdb->comments "; $where = "WHERE comment_approved='1' AND comment_type='' AND comment_author='$extra'"; $count = $wpdb->get_var($query . $where); break; case 'comments_by_email': // use $extra for author email (case INsensitive) $query = "SELECT COUNT(*) FROM $wpdb->comments "; $where = "WHERE comment_approved='1' AND comment_type='' AND comment_author_email='$extra'"; $count = $wpdb->get_var($query . $where); break; case 'comments_per_post': // $extra is decimal place precision (0 for integer only) // posts $posts_count = wp_count_posts('post'); $posts_count = $posts_count->publish; // comments $query = "SELECT COUNT(*) FROM $wpdb->comments "; $where = "WHERE comment_approved='1' AND comment_type=''"; $comment_count = $wpdb->get_var($query . $where); // average return round($comment_count / $posts_count, $extra); default: $count = 0; } // exit if ($format) {$count = number_format_i18n($count);} return $count; /********************************************************************** Copyright © 2011 Gizmo Digital Fusion (http://wpCodeSnippets.info) you can redistribute and/or modify this code under the terms of the GNU GPL v2: http://www.gnu.org/licenses/gpl-2.0.html **********************************************************************/ } |
Использование: [wcs_count type="posts"]
. Полный список атрибутов доступен на сайте разработчиков.
6. Показываем скрытый текст после определенной даты
Можно использовать при проведении конкурсов, или поздравлении с праздниками, например.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function content_countdown($atts, $content = null){ extract(shortcode_atts(array( 'month' => '', 'day' => '', 'year' => '' ), $atts)); $remain = ceil((mktime( 0,0,0,(int)$month,(int)$day,(int)$year) - time())/86400); if( $remain > 1 ){ return $daysremain = "<div class=\"event\">Осталось дней до появления - <strong>($remain)</strong></div>"; }else if($remain == 1 ){ return $daysremain = "<div class=\"event\">Остался всего <strong>($remain)</strong> день до появления</div>"; }else{ return $content; } } add_shortcode('cdt', 'content_countdown'); |
Используем так: [cdt month="01" day="01" year="2012"] Новый год! [/cdt]
. До наступления указанной даты, будет показан счетчик обратного отсчета.
7. Открываем PDF через GoogleDocs
Данный шорткод перенаправляет PDF на GoogleDocs, что намного удобнее для пользователя.
1 2 3 4 |
function pdflink($attr, $content) { return '<a class="pdf" href="http://docs.google.com/viewer?url=' . $attr['href'] . '">'.$content.'</a>'; } add_shortcode('pdf', 'pdflink'); |
Использование: [pdf href="http://yoursite.com/linktoyour/file.pdf"] Читать PDF [/pdf]
.
8. Вставка видео с YuoTube
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function youtube($atts) { extract(shortcode_atts(array( "value" => 'http://', "width" => '640', "height" => '390', "name"=> 'movie', "allowFullScreen" => 'true', "allowScriptAccess"=>'always', "controls"=> '1', ), $atts)); return '<object style="height: '.$height.'px; width: '.$width.'px"><param name="'.$name.'" value="'.$value.'"><param name="allowFullScreen" value="'.$allowFullScreen.'"><param name="allowScriptAccess" value="'.$allowScriptAccess.'"><embed src="'.$value.'" type="application/x-shockwave-flash" allowfullscreen="'.$allowFullScreen.'" allowScriptAccess="'.$allowScriptAccess.'" width="'.$width.'" height="'.$height.'"></object>'; } add_shortcode("youtube", "youtube"); |
Чтобы использовать этот шорткод, надо знать ID нужного видео: [youtube value="XXXXXX"]
9. Удаляем автоформатирование текста
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function my_formatter($content) { $new_content = ''; $pattern_full = '{(\[raw\].*?\[/raw\])}is'; $pattern_contents = '{\[raw\](.*?)\[/raw\]}is'; $pieces = preg_split($pattern_full, $content, -1, PREG_SPLIT_DELIM_CAPTURE); foreach ($pieces as $piece) { if (preg_match($pattern_contents, $piece, $matches)) { $new_content .= $matches[1]; } else { $new_content .= wptexturize(wpautop($piece)); } } return $new_content; } remove_filter('the_content', 'wpautop'); remove_filter('the_content', 'wptexturize'); add_filter('the_content', 'my_formatter', 99); |
Использование: [raw]К этому тексту не будет применено форматирование wordpress.[/raw]
10. Выводим похожие посты
Конечно, можно сделать это с помощью плагина, но, используя шорткод, можно показывать похожие посты только для некоторых записей.
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 |
function related_posts_shortcode( $atts ) { extract(shortcode_atts(array( 'limit' => '5', ), $atts)); global $wpdb, $post, $table_prefix; if ($post->ID) { $retval = '<ul>'; // Get tags $tags = wp_get_post_tags($post->ID); $tagsarray = array(); foreach ($tags as $tag) { $tagsarray[] = $tag->term_id; } $tagslist = implode(',', $tagsarray); // Do the query $q = "SELECT p.*, count(tr.object_id) as count FROM $wpdb->term_taxonomy AS tt, $wpdb->term_relationships AS tr, $wpdb->posts AS p WHERE tt.taxonomy ='post_tag' AND tt.term_taxonomy_id = tr.term_taxonomy_id AND tr.object_id = p.ID AND tt.term_id IN ($tagslist) AND p.ID != $post->ID AND p.post_status = 'publish' AND p.post_date_gmt < NOW() GROUP BY tr.object_id ORDER BY count DESC, p.post_date_gmt DESC LIMIT $limit;"; $related = $wpdb->get_results($q); if ( $related ) { foreach($related as $r) { $retval .= '<li><a title="'.wptexturize($r->post_title).'" href="'.get_permalink($r->ID).'">'.wptexturize($r->post_title).'</a></li>'; } } else { $retval .= ' <li>No related posts found</li>'; } $retval .= '</ul>'; return $retval; } return; } add_shortcode('related_posts', 'related_posts_shortcode'); |
Используем так: [related_posts]
Как добавить кнопку вызова шорткодов в редактор?
И последнее. Если вы часто и много используете шорткоды, то будет полезным добавить в редактор постов кнопку вызова всех шорткодов. Это можно сделать так:
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 |
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>'; } |
Это позволит не набирать шорткоды на клавиатуре, а просто выбрать из выпадающего списка.
Еще несколько шорткодов вы можете найти на сайтах wp-info, n-wp (на русском) и wp.tutsplus (на английском).
Кстати, статья участвует в конкурсе «TOP-10» от Сергея Шелвина с призовым фондом в 500$! Все участники получат инвайт на MarkDay.ru – сообщество оптимизаторов, вебмастеров и манимейкеров.