Программирование WordPress: посты
Рассмотрим простой тег (tag) шаблона (темплейта от англ. template) Вордпресса get_posts(), используемый в мультилупах — составных сложных лупах (multiple loops). Лупы — это цикл повторения какого-либо действия. Например, нужно посчитать от 1 до 10, для этого используем луп, в которой переменная (допустим $i) будет каждый шаг увеличиваться на +1. Этот прием программирования применяется для повторных однотипных действиий. Пример использование тега:
<?php get_posts('arguments'); ?>
Параметры: WordPress 2.5
$numberposts (по умолчанию 5) — количество постов; 0 — максимальное количество на страницу, -1 — безлимитно.
$offset (по умолчанию 0) — офсет, т.е. пропуск постов от последнего.
$category — категория поста.
$category_name — имя категории поста.
$tag — теги поста.
$orderby — сортировка.
'author' — сортировать по нумерации ID авторов.
'category' — сортировать по нумерации ID категорий.
'content' — сортировать по контенту (содержимому).
'date' — сортировать по публикации.
'ID' — сортировать по нумерации ID постов.
'menu_order' — сортировать по порядку. Использовать только со страницами.
'mime_type' — сортировать по MIME-типу. Использовать только с атачментами.
'modified' — сортировать по дате апдейта (обновления, редактирования).
'name' — сортировать по коротким вырезкам.
'parent' — сортировать по родительскому ID.
'password' — сортировать по паорлю.
'rand' — сортировать по случайности.
'status' — сортировать по статусу.
'title' — сортировать по тайтлу (названию).
'type' — сортировать по типу.
Ниже рассмотрены остальные параметры функции get_posts().
Примеры применения тега Вордпресс get_posts()
Вывод нумерации постов
Если требуется пронумеровать посты, комментарии, категории, теги или что-то еще, то это делается очень просто — вводом новой переменной в PHP. Итак, выводим порядковый номер поста:
<ul>
<?php
global $post; $num_posts = 1;
$myposts = get_posts($args);
foreach ($myposts as $post) :
?>
<li>
Номер поста: <?php echo $num_posts; ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php $num_posts++; ?>
<?php endforeach; ?>
</ul>
Сокращенную запись "$num_posts++" можно записать и так: "$num_posts = $num_posts + 1".
Вывод списка постов с офсетом (отступом)
Покажем только один пост на морде — главной странице блога и список ссылок следующих пяти постов из категории с ID 1:
<ul>
<?php
global $post;
$myposts = get_posts('numberposts=5 & offset=1 & category=1');
foreach ($myposts as $post) :
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>
Офсет (отступ) — это пропуск из полного списка постов первых несколько штук. Так, допустим, можно на морде блога показывать посты начиная с 6-го по 10-й, а на остальных всех страницах с 1-го по 5-й.
Некоторые данные недоступны в теге get_posts() по умолчанию, который содержится внутри the_content() или в номере ID. Нужно вызывать внутренние функции через $post-массив, как аргумент:
<?php
$lastposts = get_posts('numberposts=3');
foreach($lastposts as $post) :
setup_postdata($post);
?>
<h2>
<a href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>">
<?php the_title(); ?>
</a>
</h2>
<?php the_content(); ?>
<?php endforeach; ?>
Доступ к ID поста (статьи) или контента (содержимого поста) без вызова setup_postdata() или событий любых специальных данных поста (данные содержатся в таблице, приведенной ниже), можно использовать $post->COLUMN, где COLUMN — это табличный столбец имени данных (Field). Так, например, $post->ID содержит ID поста, $post->post_content содержит контент поста и т.д. Чтобы эти данные показать у себя на блоге, нужно использовать команду php echo вот так:
<?php echo $post->ID; ?>
Если этот код вставить в шаблон любого файла Вордпресс, то при открытии любого из постов, можно увидеть его порядковый номер в БД (Базе Данных). Рассмотрим еще несколько примеров использования тега get_posts().
Вывод последних постов
Выведем последние 10 постов с сортировкой по тайтлу (заголовку):
<?php
$postslist = get_posts('numberposts=10 & order=ASC & orderby=title');
foreach ($postslist as $post) :
setup_postdata($post);
?>
<div>
<?php the_date(); ?><br />
<?php the_title(); the_excerpt(); ?>
</div>
<?php endforeach; ?>
Вывод случайных постов
Вывод списока из пяти постов, выбранных рандомно (случайно), используя функцию MySQL RAND() по очереди:
<ul><li><h3>Случайные записи</h3>
<ul>
<?php
$rand_posts = get_posts('numberposts=5 & orderby=rand');
foreach($rand_posts as $post) :
?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endforeach; ?>
</ul>
</li></ul>
Вывод всех атачментов постов
Вывод атачментов всех постов блога; атачменты — это прикрепленные к посту детали (файлы, например). Делаем это вне лупа шаблонов.
<?php
$args = array(
'post_type' => 'attachment',
'numberposts' => -1,
'post_status' => null,
'post_parent' => null, // любой родитель
);
$attachments = get_posts($args);
if ($attachments) {
foreach ($attachments as $post) {
setup_postdata($post);
the_title();
the_attachment_link($post->ID,false);
the_excerpt();
}
}
?>
Вывод атачментов текущего поста
Выводим атачменты для текущего поста. Делаем это внутри лупа (где $post->ID номер поста).
<?php
$args = array(
'post_type' => 'attachment',
'numberposts' => -1,
'post_status' => null,
'post_parent' => $post->ID
);
$attachments = get_posts($args);
if ($attachments) {
foreach ($attachments as $attachment) {
echo apply_filters('the_title',$attachment->post_title);
the_attachment_link($attachment->ID,false);
}
}
?>
Вывод комментируемых постов
Вывод наиболее комментируемых постов блога в любом его месте с количеством комментариев в каждом посте:
<?php
$limit_comments = 15;
$mostcommenteds = $wpdb->get_results("
SELECT $wpdb->posts.ID, post_title, post_name, post_date,
COUNT($wpdb->comments.comment_post_ID) AS 'comment_total'
FROM $wpdb->posts LEFT JOIN $wpdb->comments
ON $wpdb->posts.ID=$wpdb->comments.comment_post_ID
WHERE comment_approved='1'
AND post_date_gmt < '".gmdate("Y-m-d H:i:s")."'
AND post_status='publish' AND post_password=''
GROUP BY $wpdb->comments.comment_post_ID
ORDER BY comment_total DESC LIMIT $limit_comments
");
foreach($mostcommenteds as $post){
$post_title = htmlspecialchars(stripslashes($post->post_title));
$comment_total = (int)$post->comment_total;
echo "<li>
<a href=\"".get_permalink()."\" title='$post_title'>$post_title</a> —
$comment_total
</li>";
}
?>
Вывод обновленных постов
Вывод последних обновленных постов, взято из плагина :
<?php
$hhRupDefaultOptions = array(
'num' => 3, 'skip' => 0, // Кол-во выводимых постов и офсетных.
'skipUnmodifiedPosts' => true, // Пропуск немодефицированных постов.
'includePages' => false, // Исключаем статические страницы.
'hideProtectedPosts' => true, // Скрываем защищенные посты.
'showDate' => 'd.m.y', // Формат выводимой даты обновления поста.
'excludeCategory' => 38, // Исключаем ненужные категории.
);
function hh_recently_updated_posts2($options=array()) {
$posts = hh_rup_get2($options);
echo '<ul>';
foreach ($posts as $post) {
$title_ = wp_specialchars(strip_tags(str_replace('-','- ',$post->post_title)));
echo '<li>'
.hh_rup_date($options['showDate'],$post->post_modified)
.' <a href="'.get_permalink($post->ID).'" title="'.wp_specialchars(strip_tags($post->post_title)).'">'.$title_.'</a>
</li>';
}
echo '</ul>';
}
function hh_rup_get2(&$options) {
global $wpdb;
if (!is_array($options)) return false;
hh_rup_sanitize_options($options);
$now = gmdate('Y-m-d H:i:s',time());
$select = "SELECT `ID`,`post_title`,`post_modified`,`comment_count`";
$from = "FROM `{$wpdb->posts}` AS `p`";
$where = "WHERE `post_status`='publish' AND `post_modified_gmt` != '0000-00-00 00:00:00'"
.($options['skipUnmodifiedPosts'] ? " AND `post_modified_gmt` != `post_date_gmt`" : '')
.($options['includePages'] ? " AND (`post_type`='post' OR `post_type`='page')" : " AND `post_type`='post'")
.($options['hideProtectedPosts'] ? " AND `post_password`=''" : '')." AND `post_modified_gmt` < '{$now}'";
$group = "";
$order = "ORDER BY `post_modified_gmt` DESC";
$limit = "LIMIT {$options['skip']}, {$options['num']}";
if ($options['excludeCategory']) {
$select .= ", GROUP_CONCAT(`tt`.`term_id`) AS `terms`";
$from .= " LEFT JOIN `{$wpdb->term_relationships}` AS `tr` ON `tr`.`object_id`=`p`.`ID`"
." LEFT JOIN `{$wpdb->term_taxonomy}` AS `tt` ON `tt`.`term_taxonomy_id`=`tr`.`term_taxonomy_id`";
$where .= " AND `tt`.`taxonomy`='category' AND `tt`.`term_id` NOT IN ({$options['excludeCategory']})";
$group = "GROUP BY `ID`";
}
$sql = "{$select} {$from} {$where} {$group} {$order} {$limit}";
return $wpdb->get_results($sql);
}
function hh_rup_sanitize_options(&$options) {
global $hhRupDefaultOptions;
$options = wp_parse_args($options,$hhRupDefaultOptions);
}
function hh_rup_date($showDate,&$date) {
$timestamp = strtotime($date);
$dateFmt = '';
if (true === $showDate) $dateFmt=__('d.m.y');
else if (is_string($showDate)) $dateFmt=$showDate;
if ($dateFmt) return date($dateFmt,strtotime($date)).': ';
if (false === $showDate) return '';
return '';
}
hh_recently_updated_posts2();
?>
Вывод постов из определенной рубрики
Перечисляем через запятую ID нужных рубрик.
<?php query_posts('cat=2,3 & showposts=5'); ?>
<ul>
<?php while (have_posts()) : the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endwhile;?>
</ul>
Вывод рекламы после первого поста
В файле index.php меняем строку:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
на
<?php if (have_posts()) : while (have_posts()) : the_post(); $loopcounter++; ?>
... перед endwhile вставляем
<?php if ($loopcounter<=1) include(TEMPLATEPATH.'/adsense.php'); ?> <?php endwhile; ?>
В папку шаблона темы создаем файл adsense.php, в котором будет находиться наша реклама, например блок ссылок Гугл.Адсенс или какой-либо баннер.
Исключение постов определенной рубрики из общего списка
В файле index.php меняем строку:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
на
<?php if (have_posts()) : query_posts($query_string.'&cat=-1'); while (have_posts()) : the_post(); ?>
Вывод комментируемых постов
Вывод наиболее комментируемых постов. Пока не разобрался до конца, позже добавлю.
Вывод количества постов блога
<?php
//Вывод количества опубликованных постов
$published_posts = $count_posts->publish;
//или
$published_posts = wp_count_posts()->publish;
//Вывод количества черновиков
$draft_posts = $count_posts->draft;
//Вывод количества постов
$count_posts = wp_count_posts();
//Вывод количества статических страниц
$count_pages = wp_count_posts('page');
//Вывод количества постов ('post' — по умолчанию)
$count_pages = wp_count_posts('post'); //Default
?>
Источник:
Вывод количества постов автора блога
Вывод количества постов для одного автора (он же пользователь или "юзер" от англ. user), например, админа можно сделать при помощи функции get_usernumposts(userid), где userid — ID автора блога:
<?php get_usernumposts(1); ?>
Для нескольких авторов (или всех) можно воспользоваться циклом вывода или используя запросы в БД напрямую, например, создав функцию:
<?php
function get_usernumposts($userid) {
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts
WHERE post_author=%d AND post_type='post' AND ",$userid)
.get_private_posts_cap_sql('post')
); return $count;
}
?>
Источник:
Вывод постов определенной даты
<?php
function filter_where($where='') {
//posts in the last 30 days
//$where .= " AND post_date > '".date('Y-m-d',strtotime('-30 days'))."'";
//posts 30 to 60 days old
//$where .= " AND post_date >= '".date('Y-m-d',strtotime('-60 days'))."'"
." AND post_date <= '".date('Y-m-d',strtotime('-30 days'))."'";
//posts for March 1 to March 15, 2009
$where .= " AND post_date >= '2009-03-01' AND post_date < '2009-03-16'";
return $where;
}
add_filter('posts_where','filter_where');
query_posts($query_string);
?>
Источник:
Таблица тега Вордпресс get_posts()
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| ID | bigint(20) unsigned | PRI & IND Pt4 | auto_increment | ||
| post_author | bigint(20) unsigned | 0 | FK-> wp_users.ID | ||
| post_date | datetime | IND Pt3 | 0000-00-00 00:00:00 | ||
| post_date_gmt | datetime | 0000-00-00 00:00:00 | |||
| post_content | longtext | ||||
| post_title | text | ||||
| post_excerpt | text | ||||
| post_status | varchar(20) | IND PT2 | publish | ||
| comment_status | varchar(20) | open | |||
| ping_status | varchar(20) | open | |||
| post_password | varchar(20) | ||||
| post_name | varchar(200) | IND | |||
| to_ping | text | ||||
| pinged | text | ||||
| post_modified | datetime | 0000-00-00 00:00:00 | |||
| post_modified_gmt | datetime | 0000-00-00 00:00:00 | |||
| post_content_filtered | text | ||||
| post_parent | bigint(20) unsigned | 0 | FK-> wp_posts.ID | ||
| guid | varchar(255) | ||||
| menu_order | int(11) | 0 | |||
| post_type | varchar(20) | IND Pt1 | post | ||
| post_mime_type | varchar(100) | ||||
| comment_count | bigint(20) | 0 |
Оригинал таблицы и тега . Также таблица Вордпресс Базы Данных (WordPress database, сокращенно WPDB), готовится пользователем . Также см. классы WPDB — .
Значения полей (Field) таблицы:
ID — порядковый номер поста (записи, статьи).
post_author — автор поста.
post_date, post_date_gmt — дата публикации поста обычная и дата по gmt. Формат по умолчанию: 0000-00-00 00:00:00.
post_content — содержимое поста: текст, картинки и т.д.
post_title — заголовок поста, его название.
post_excerpt — аннотация поста, его первый абзац.
post_status — статус поста.
- publish — опубликованный для всех читателей. По умолчанию.
- pending — рассматриваемый пост, находящийся на модерации.
- draft — неопубликованный черновик.
- future — запланированный пост, публикуемый в определенную дату.
- private — опубликованный для автора, другие не видят.
- inherit — используется для наследования признаков "детей" (подпостов), см. get_children. Принимается по умолчанию, если $post_type установлен как attachment.
- trash (WP 2.9) — "мусор", удаленные посты.
- static — нет данных.
- object — нет данных.
- (blank) — все статусы.
comment_status — статус комментариев поста.
- open, closed — открыты и закрыты соответственно.
- registered_only — только для зарегистрированных.
ping_status — статус пингов поста.
- open, closed — открыты и закрыты соответственно.
post_password — пароль поста.
post_name — имя поста.
to_ping —.
pinged —.
post_modified, post_modified_gmt — апдейт поста, т.е. время его последнего редактирования.
post_content_filtered —.
post_parent — пост-родитель.
guid — гид.
menu_order — сортировка.
post_type — тип поста, может принимать значения:
- post — топик (статья, запись). По умолчанию.
- page — статическая страница.
- attachment — прикрепленные данные, аттачмент.
post_mime_type — mime-тип поста.
comment_count — счетчик количества комментариев в данном посте.
Ну вот пока все, в чем разобрался. Узнаю еще что-то нового, добавлю. А в следующий раз попробуем разобраться в выводе категорий и... создании Карты Блога.
Другие статьи по теме seo (оптимизация), монетизации и раскрутке:
Комментариев: Комментарии (5)
Опубликованно: Понедельник, Сентябрь 14th, 2009 в 20:34
Обновлено: 13 Ноябрь 2009 в 21:14.
Директории: Wordpress
Автор: admin, все авторы.
В статье: 1808 слов. Ссылки на странице.
Понравилась статья? - Не пропустите следующую, подпишитесь на RSS-канал[],
Также Вы можете оставить комментарий, или на Вашем сайте.
Эту статью находят по поисковым запросам:





Метки статьи:



463768885,
zgr@bk.ru...























октября 11, 2009 Комментариев: 8
Цитировать
Нравятся мне умные мужчины
октября 17, 2009 Комментариев: 2
Цитировать
Игорь Леонидович, подскажите пожалуйста.
Хочу вывести рядом с именем комментатора количество отставленных им комментариев на блоге.
Может вы знаете какой функцией можно воспользоваться.
октября 17, 2009 Комментариев: 53
Цитировать
Встроенной функции такой нет, увы, не предусмотрено по умолчанию, но составить запрос самому не сложно, там всего 3-4 строчки, но есть одно «но» пока: заметил, что некоторые запросы в БД работают не на всех страницах… ??? Какие-то фильтры придуманы, что ли, хотя не пойму почему так, ведь я не использую встроенные переменные, а запросы прямиком в БД делаю.
Я сейчас изучаю «Юзеров», буду готовить заметку на днях для топика, если не горит, то подождите пару дней, я код у себя проверю (хочу, чтоб цифры не только в комментариях выводились, а на любой странице) и вышлю вам или у себя топик опубликую, где приведу подробные примеры для «Юзеры» категории «Комментаторы».
октября 18, 2009 Комментариев: 2
Цитировать
Отлично!
Будем ждать.
ноября 3, 2009 Комментариев: 1
Цитировать
Супер пост! Большое спасибо, самому разбираться времени не хватает, а очень надо
Всё подробно и понятно описано. Добавляюсь блог в ридер и джу продолжений