Сделал небольшую подборочку шорткодов (short code) для WP. Думаю, что будет полезно.
Для справки: шорткод - это обычно коротенькая функция (или иное мелкое улучшение) для WP, которая позволяет либо расширить какую-нибудь стандартную функцию, либо сделать что-то без помощи плагина, дабы не нагружать WP
Итак поехали!
Отключаем автосохранение постов в админке (кого как, а меня раздражает :-))
вставляем в functions.php следующий код:
PHP код:
function disableAutoSave(){
wp_deregister_script('autosave');
}
add_action( 'wp_print_scripts', 'disableAutoSave' );
Автоматичекое вставление картинок, используя имя файла
вставляем в functions.php следующий код:
PHP код:
function image_shortcode($atts, $content = null) {
extract( shortcode_atts( array(
'name' => '',
'align' => 'right',
'ext' => 'png',
'path' => '/wp-content/uploads/',
'url' => ''
), $atts ) );
$file=ABSPATH."$path$name.$ext";
if (file_exists($file)) {
$size=getimagesize($file);
if ($size!==false) $size=$size[3];
$output = "<img src='".get_option('siteurl')."$path$name.$ext' alt='$name' $size align='$align' class='align$align' />";
if ($url) $output = "<a href='$url' title='$name'>".$output.'</a>';
return $output;
}
else {
trigger_error("'$path$name.$ext' image not found", E_USER_WARNING);
return '';
}
}
add_shortcode('image','image_shortcode');
Теперь мы можем использовать такой шорткод:
Код HTML:
[image name=название картинки]
Настройки:align-выравнивание, ext - расширение файлов, path - папка с картинками
Считаем количество слов в посте
вставляем в functions.php следующий код:
PHP код:
function wcount(){
ob_start();
the_content();
$content = ob_get_clean();
return sizeof(explode(" ", $content));
}
Вызов функции
PHP код:
<?php echo wcount(); ?>
Отображаем тэги для определенной категори (если пофантазировать - очень удобная штука для навигации)
вставляем код куда нам надо:
PHP код:
<?php
query_posts('category_name=НАЗВАНИЕ КАТЕГОРИИ');
if (have_posts()) : while (have_posts()) : the_post();
$posttags = get_the_tags();
if ($posttags) {
foreach($posttags as $tag) {
$all_tags_arr[] = $tag -> name;
}
}
endwhile; endif;
$tags_arr = array_unique($all_tags_arr);
echo '<pre>'.print_r($tags_arr, true).'</pre>';
?>
Отключаем автоматическое форматирование части текста
вставляем в functions.php следующий код:
PHP код:
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);
Теперь такой текст
Код HTML:
[raw]Unformatted code[/raw]
не будет автоматически форматироваться
Отображаем категории в две калонки
вставляем код куда нам надо:
PHP код:
<?php
$cats = explode("<br />",wp_list_categories('title_li=&echo=0&depth=1&style=none'));
$cat_n = count($cats) - 1;
for ($i=0;$i<$cat_n;$i++):
if ($i<$cat_n/2):
$cat_left = $cat_left.'<li>'.$cats[$i].'</li>';
elseif ($i>=$cat_n/2):
$cat_right = $cat_right.'<li>'.$cats[$i].'</li>';
endif;
endfor;
?>
<ul class="left">
<?php echo $cat_left;?>
</ul>
<ul class="right">
<?php echo $cat_right;?>
</ul>
Часть текста, которая видна только зарегистрированным пользователям
вставляем в functions.php следующий код:
PHP код:
add_shortcode( 'member', 'member_check_shortcode' );
function member_check_shortcode( $atts, $content = null ) {
if ( is_user_logged_in() && !is_null( $content ) && !is_feed() )
return $content;
return '';
}
Теперь такой текст (урл, картинка и т.д) увидят только зарегистрированные пользователи
Код HTML:
[member]
Какойто текст бла-бла
[/member]
Отображаем посты между определенными датами
вставляем код перед началом цикла:
PHP код:
<?php
function filter_where($where = '') {
$where .= " AND post_date >= '2009-05-01' AND post_date <= '2009-05-15'";
return $where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
?>
Даты меняем по необходимости
Отображаем количество фалловеров у записи (Twitter)
вставляем в functions.php следующий код:
PHP код:
<?php
function tweets($url){
$content = file_get_contents("http://api.tweetmeme.com/url_info?url=".$url);
$x = new SimpleXmlElement($content);
$tweets = $x->story->url_count;
echo "Tweets: ".$tweets;
}
Для вызова функции используется
PHP код:
<?php tweets($post->permalink); ?>
Вставляется в single.php
Отображаем количество зарегистрированных пользователей
вставляем код куда нам надо:
PHP код:
$users = $wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->users");
echo $users." registered users.";
Отображаем пост в три колонки
Вставляется в single.php:
PHP код:
<?php
$page_columns = explode("[--column--]", $post->post_content);
print $page_columns[0];
print '<div class="column first">';
print $page_columns[1];
print '</div>';
print'<div class="column second">';
print $page_columns[2];
print '</div>';
print '<div class="column third">';
print $page_columns[3];
print '</div>';
?>
При этом пост должен быть оформлен так:
Код HTML:
идет какой-то текст.....
[--column--]
Текст для первой колонки
[--column--]
Текст для второй колонки
[--column--]
Текст для третьей колонки
Не забудте придать этому вид с помощью CSS
Получаем последние комментарии без плагина
Вставляем код куда надо:
PHP код:
<?php
global $wpdb;
$sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url, SUBSTRING(comment_content,1,30) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT 10";
$comments = $wpdb->get_results($sql);
$output = $pre_HTML;
$output .= "\n<ul>";
foreach ($comments as $comment) {
$output .= "\n<li>".strip_tags($comment->comment_author) .":" . "<a href=\"" . get_permalink($comment->ID)."#comment-" . $comment->comment_ID . "\" title=\"on ".$comment->post_title . "\">" . strip_tags($comment->com_excerpt)."</a></li>";
}
$output .= "\n</ul>";
$output .= $post_HTML;
echo $output;
?>
Число комментариев настраивается, по умолчанию 10
Не показываем картинки из поста, когда он на главной странице
вставляем в functions.php следующий код:
PHP код:
add_filter('the_content','wpi_image_content_filter',11);
function wpi_image_content_filter($content){
if (is_home() || is_front_page()){
$content = preg_replace("/<img[^>]+\>/i", "", $content);
}
return $content;
}
Показываем похожие записи без плагина
вставляем в functions.php следующий код:
PHP код:
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');
Фунция вызывается так:
Код HTML:
[related_posts]
Показываем количество результатов найденных в поиске
в файле search.php ищем:
Код HTML:
<h2 class="pagetitle">Search Results</h2>
Заменяем на:
PHP код:
<h2 class="pagetitle">Search Results for <?php /* Search Count */ $allsearch = &new WP_Query("s=$s&showposts=-1"); $key = wp_specialchars($s, 1); $count = $allsearch->post_count; _e(''); _e('<span class="search-terms">'); echo $key; _e('</span>'); _e(' — '); echo $count . ' '; _e('articles'); wp_reset_query(); ?></h2>
Убираем напоминание об обновлении
вставляем в functions.php следующий код:
PHP код:
if ( !current_user_can( 'edit_users' ) ) {
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
}
Показываем запланированные посты
Вставляем куда надо:
PHP код:
<div>
<div><p>Скоро читайте</p></div>
<?php query_posts('showposts=10&post_status=future'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div >
<p class><b><?php the_title(); ?></b><?php edit_post_link('e',' (',')'); ?><br />
<span class="datetime"><?php the_time('j. F Y'); ?></span></p>
</div>
<?php endwhile; else: ?><?php endif; ?>
</div>
Показываем посты рандомом
На заметку: кто не понимает как работает цикл (loop) будте осторожны
в index.php перед началом цикла вставляем:
PHP код:
query_posts('orderby=rand');
Запретить к индексации определенную категорию
в header.php вставляем между тэгами <head></head>
PHP код:
<?php if ( is_category('8') || in_category('8') ) {
echo '<meta name="robots" content="noindex">';
}
8 - id категории
если надо запретить определенный пост, то:
PHP код:
<?php if ($post->ID == 17) {
echo '<meta name="robots" content="noindex">';
}
17 - id поста
Показываем рандомный пост в сайдбаре
вставляем там где надо:
PHP код:
query_posts(array('orderby' => 'rand', 'showposts' => 1));
if (have_posts()) :
while (have_posts()) : the_post();
the_title();
the_excerpt();
endwhile;
endif;
Показываем самый комментируемый пост за определенное время
вставляем там где надо:
PHP код:
<h2>Самая обсуждаемая новость</h2>
<ul>
<?php
$result = $wpdb->get_results("SELECT comment_count,ID,post_title, post_date FROM $wpdb->posts WHERE post_date BETWEEN '2008-01-01' AND '2008-12-31' ORDER BY comment_count DESC LIMIT 0 , 10");
foreach ($result as $topten) {
$postid = $topten->ID;
$title = $topten->post_title;
$commentcount = $topten->comment_count;
if ($commentcount != 0) {
?>
<li><a href="<?php echo get_permalink($postid); ?>"><?php echo $title ?></a></li>
<?php }
}
?>
</ul>
Даты настраиваются
Подсвечиваем текущую категорию
в CSS добавляем:
Код HTML:
#nav .current-cat{
background:#999;
color:#222;
text-decoration:underline;
}
Авторы шортокодов: WP recipes, Blog Oh Blog, Kyle Eslick, Avice De’vereux, Blue Anvil, ProBlogDesign, WordPress Codex, Joost de Valk
Подборку сделал (и местами перевел) LSN
ЗЫ: виджеты - зло!
Read Full Post »