Программирование 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 |
Оригинал таблицы
Значения полей (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 (оптимизация), монетизации и раскрутке:
Комментариев: Комментарии (11)
Опубликованно: Понедельник, Сентябрь 14th, 2009 в 20:34
Обновлено: 13 Ноябрь 2009 в 21:14.
Директории: Wordpress
Автор: admin, все авторы.
В статье: 1808 слов. Ссылки на странице.

Понравилась статья? - Не пропустите следующую, подпишитесь на RSS-канал[
Также Вы можете оставить комментарий, или
Эту статью находят по поисковым запросам:
Октябрь 11th, 2009 Комментариев: 8
Цитировать
Нравятся мне умные мужчины
Октябрь 17th, 2009 Комментариев: 2
Цитировать
Игорь Леонидович, подскажите пожалуйста.
Хочу вывести рядом с именем комментатора количество отставленных им комментариев на блоге.
Может вы знаете какой функцией можно воспользоваться.
Октябрь 17th, 2009 Комментариев: 77
Цитировать
Встроенной функции такой нет, увы, не предусмотрено по умолчанию, но составить запрос самому не сложно, там всего 3-4 строчки, но есть одно «но» пока: заметил, что некоторые запросы в БД работают не на всех страницах… ??? Какие-то фильтры придуманы, что ли, хотя не пойму почему так, ведь я не использую встроенные переменные, а запросы прямиком в БД делаю.
Я сейчас изучаю «Юзеров», буду готовить заметку на днях для топика, если не горит, то подождите пару дней, я код у себя проверю (хочу, чтоб цифры не только в комментариях выводились, а на любой странице) и вышлю вам или у себя топик опубликую, где приведу подробные примеры для «Юзеры» категории «Комментаторы».
Октябрь 18th, 2009 Комментариев: 2
Цитировать
Отлично!
Будем ждать.
Ноябрь 3rd, 2009 Комментариев: 1
Цитировать
Супер пост! Большое спасибо, самому разбираться времени не хватает, а очень надо
Всё подробно и понятно описано. Добавляюсь блог в ридер и джу продолжений
Апрель 1st, 2010 Комментариев: 1
Цитировать
Ай Пи Мани, плагин Comment Counter
Сентябрь 11th, 2011 Комментариев: 1
Цитировать
спасибо помогло
Сентябрь 14th, 2011 Комментариев: 1
Цитировать
Прошу прощения, а можно как-то вывести 10 анонсов рандомно, но со сроком – допустим, не позднее года от определенной системой сегодняшней датой?
Январь 3rd, 2012 Комментариев: 1
Цитировать
В принципе как вывести список постов понятно, а вот как эту функцию реализовать ссылкой? У меня главная home.php и я хочу так же сделать вывод постов по дате как в index.php., т..е нажимаешь на кнопку меню и выводятся все посты по дате публикации. Можно ли так сделать? или подскажите в какую сторону копать?
я вот думаю шорткодом сделать, но как его ссылкой сделать не пойму.
Февраль 11th, 2012 Комментариев: 1
Цитировать
Помогите пожалуйста!
Уж не знаю к кому и обратится. Вроде и код простой, а никто ничего ответить не может.
Вот код, который выводит список ВСЕХ постов во ВСЕХ категориях:
term_id);
?>
name; ?>
<a href="">
Как исключить из него некоторые категории, чтобы выводились только нужные, а не все имеющиеся категории на сайте?
Знающему человеку это не проблема, а я уже третий день мучаюсь.
Апрель 25th, 2012 Комментариев: 1
Цитировать
Здравствуйте. У меня такой вопрос: на сайте были установленны постоянные цифровые ссылки (/archives/123), однако они почему-то считают не подряд…. Т.е. если ставить один пост за другим в течение короткого времени, они более менее упорядочные, но все равно есть разбежность. Например, поставила пост, который отобразился с номером 12783, а через 5 минут поставила новый пост – и он уже с номером 12785… Но куда же делся тогда 12784???
А если проходит около часа или больше – разбежность может доходить даже до 50 единиц… Что это может быть??? Помогите!!!