wp_insert_post() — функция позволяет создать новую запись / страницу или обновить уже существующую. Wordpress post
get_post() - функция WordPress
Возвращает всю инфу, содержащуюся в базе данных (таблица wp_posts) об указанном в параметрах посте (любого типа, то есть это может быть страница page, запись post или какой-либо произвольный тип записи).
get_post( $post = null, $output = OBJECT, $filter = 'raw' ); |
- OBJECT — в виде объекта,
- ARRAY_A — ассоциативный массив,
- ARRAY_N — нумерованный массив;
Параметры объекта поста WP_Post
То есть в этом случае $output = OBJECT. Каждый из параметров соответствует столбцу из таблицы MySQL.
ID (целое число) ID поста post_author (целое число) ID автора поста post_date (строка) дата и время публикации поста в формате YYYY-MM-DD HH:MM:SS post_date_gmt (строка) дата и время (GMT) публикации поста в формате YYYY-MM-DD HH:MM:SS post_content (строка) контент (содержимое) поста post_title (строка) заголовок post_category (строка) по идее это ID рубрики, к которой относится пост, однако с версии WordPress 2.1 всегда равно 0, чтобы определить рубрики, воспользуйтесь функцией get_the_category(). post_excerpt (строка) содержимое поля «Цитата» post_status (строка) статус поста comment_status (строка) настройки комментирования ping_status (строка) разрешены ли трэкбэки и пингбэки post_password (строка) пароль к посту post_name (строка) ярлык поста to_ping (строка) URL для пинга pinged (строка) URL, которые уже пингнуты post_modified (строка) дата и время последнего обновления(редактирования) поста в формате YYYY-MM-DD HH:MM:SS post_modified_gmt (строка) дата и время GMT последнего обновления(редактирования) поста в формате YYYY-MM-DD HH:MM:SS post_content_filtered (строка) post_parent (целое число) ID родительского поста (например для вложений или страниц) guid (строка) ссылка на пост вида https://misha.blog/?p=8542 menu_order (целое число) post_type (строка) тип поста post_mime_type (строка) MIME тип (для вложений) comment_count (целое число) количество комментариев к постуecho $post->ID; // 1285 echo $post->post_author; // 1 echo $post->post_date; // 2012-12-09 05:55:07 echo $post->post_date_gmt; // 2012-12-09 01:55:07 echo $post->post_content; // Про класс WP_Query можно сказать в двух словах - бла бла бла echo $post->post_title; // WP_Query(), описание класса, параметры print_r( $post->post_category ); // Array ( [3] => 3 ) echo $post->post_excerpt; echo $post->post_status; // publish echo $post->comment_status; // open echo $post->ping_status; // open echo $post->post_password; echo $post->post_name; // wp_query echo $post->to_ping; echo $post->pinged; echo $post->post_modified; // 2012-12-09 12:46:24 echo $post->post_modified_gmt; // 2012-12-09 08:46:24 echo $post->post_content_filtered; echo $post->post_parent; // 0 echo $post->guid; // https://misha.blog/blog/?p=1285 echo $post->menu_order; // 0 echo $post->post_type; // post echo $post->post_mime_type; // echo $post->comment_count; // 18 |
Примеры использования
Предлагаю разобраться с форматом вывода. Итак, зная ID поста, выведем например его статус и заголовок. Пример, когда возвращается объект:
$my_post = get_post( 5 ); echo $my_post->post_status; echo $my_post->post_title; |
Ассоциативный массив:
$my_post = get_post( 5, ARRAY_A ); echo $my_post['post_status']; echo $my_post['post_title']; |
В случае с нумерованным массивом нужно заранее знать индексы соответствующих значений. Их можно выяснить например при помощи php-функции print_r().
$my_post = get_post( 5, ARRAY_N ); echo $my_post[7]; echo $my_post[11]; |
Важно: указывать ID поста в виде целого числа стало возможно только после версии WordPress 3.5. До этого ID поста нужно было передавать только в переменной, то есть:
$post = 5; $my_post = get_post( $post ); |
misha.blog
Произвольные типы записей в WordPress
Вот мы наконец-то и добрались до такой важнейшей темы, как вордпрессовские типы постов (или типы записей). Нет, серьёзно, если ваш сайт представляет из себя чуть больше, чем просто блог, то умение обращаться с типами постов просто необходимо.
Почему раньше WordPress называли движком только для блогов? Потому что раньше в нем не было типов записей (на самом деле некоторые люди с сайтами на джумле до сих пор упрямо считают, что удел WP — блоги, но мы все прекрасно знаем, что это далеко не так).
Если вы уже более или менее знакомы с типами постов в WordPress и их созданием, читайте про их вывод в цикле в статье про WP_Query и про файлы темы, используемые для них в качестве шаблонов.
Также вы можете глянуть этот обзорный видеоурок:
Стандартные типы записей WordPress
Понять, что представляют из себя типы постов легче всего на примере. В WordPress по умолчанию (если вы не ставили никаких тем и плагинов) уже есть несколько типов постов:
- Записи (каждый тип поста имеет отдельное название для использования в коде, у записей это post)
- Страницы page
- Вложения attachment
- Редакции revision
- Элементы меню nav_menu_item
Что общего у всех этих типов? Все они являются элементами содержимого сайта, имеют какие-либо параметры. Информацию о них можно получить или вывести, например в виде объекта поста WP_Post.
Давайте вкратце рассмотрим каждый из стандартных типов постов, чтобы иметь общее представление о них.
Записи
Если на вашем сайте присутствует блог, то этот стандартный тип поста очень удобно использовать в качестве статей на блоге. Записи по умолчанию выводятся на главных страницах многих тем WordPress в порядке даты публикации (по убыванию). Они также попадают в RSS-ленту сайта.

Шаблоном страницы записи является файл темы single.php.
Страницы
О да! Страницы — это потрясающая штука! В целом они похожи на записи, но имеют несколько уникальных особенностей. Итак, страницы:

- Первое и самое главное — страницы могут использовать произвольный файл из папки с темой в качестве своего HTML/PHP шаблона. Это значит, что в принципе каждая страница может кардинально отличаться от общего дизайна и верстки сайта. Но на самом деле, с версии 4.7 мы можем использовать шаблоны страниц для любого типа поста.
- Имеют иерархию. Т.е. одна страница может быть родительской для других страниц.
- Имеется возможность сортировать их по порядку. В принципе каждый тип поста имеет такую возможность, но в страницах этот функционал предусмотрен по умолчанию.
- При включенных постоянных ссылках на сайте, страницы имеют URL вида http://ваш-сайт.ru/ярлык_страницы, например https://misha.blog/contacts. Если имеются родительские элементы, они также будут включены в URL. Удобно.
В качестве шаблона страницы может быть задействован один из следующих файлов. Файлы указаны в порядке приоритета задействования. Т.е., если файла под номером 1 не существует, то будет задействован файл под номером 2.
- {ваш_шаблон}.php файл с произвольным названием, будет использоваться как шаблон страницы, если выбран на странице редактирования страницы.
- page-{ярлык_страницы}.php
- page-{ID_страницы}.php
- page.php
Вложения
Тип поста, предназначенный для управления файлами, загруженными через стандартный вордпрессовский загрузчик, а также для хранения информации о них. Например у изображений это может быть их размер, альтернативный текст (для HTML-атрибута alt) и т.д.

Редакции
Редакции записей — это черновики, которые автоматически сохраняются в процессе редактирования записей (также могут быть использованы и в других типах постов, не только в post). И, если вы вдруг написали в своей статье что-то не то, вы всегда cможете восстановить её старую версию из одной из редакций.

Метабокс с редакциями вы найдёте на странице редактирования любой записи.
Элементы меню
Данный тип постов хранит информацию об элементах навигации в WordPress. Кстати, это единственный тип, который не используется для работы с контентом сайта.
Регистрация пользовательского типа поста
Конечно же, самое интересное начинается, когда мы создаем собственный тип записей. Причем это может быть абсолютно что угодно, например работы в портфолио, опросы, товары в интернет-магазине.
В качестве примера давайте добавим «Функции WordPress». То есть, нам нужно, чтобы у функций был собственный шаблон страниц, собственные категории, ну, и если мы будем постить по 3 функции в день (к примеру), то нам тем более не надо захламлять RSS-канал.
Всего будет 4 шага создания типа поста. На самом деле, чтобы всё заработало, достаточно и одного-двух этапов, но нам ведь надо, чтобы всё было на высшем уровне.
Шаг 1. register_post_type()
Всё начинается с функции register_post_type(). Пока что вы можете использовать код, приведённый ниже, подставив свои собственные значения параметров в массивы.
add_action( 'init', 'true_register_post_type_init' ); // Использовать функцию только внутри хука init function true_register_post_type_init() { $labels = array( 'name' => 'Функции', 'singular_name' => 'Функцию', // админ панель Добавить->Функцию 'add_new' => 'Добавить функцию', 'add_new_item' => 'Добавить новую функцию', // заголовок тега <title> 'edit_item' => 'Редактировать функцию', 'new_item' => 'Новая функция', 'all_items' => 'Все функции', 'view_item' => 'Просмотр функции на сайте', 'search_items' => 'Искать функции', 'not_found' => 'Функций не найдено.', 'not_found_in_trash' => 'В корзине нет функций.', 'menu_name' => 'Кодекс WP' // ссылка в меню в админке ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, // показывать интерфейс в админке 'has_archive' => true, 'menu_icon' => get_stylesheet_directory_uri() .'/img/function_icon.png', // иконка в меню 'menu_position' => 20, // порядок в меню 'supports' => array( 'title', 'editor', 'comments', 'author', 'thumbnail') ); register_post_type('functions', $args); } |
Важно: в качестве имени типа поста (первый аргумент функции) нельзя использовать следующие слова: post, page, attachment, revision, nav_menu_item, action, order, theme. Помню случай, когда я пытался зарегистрировать тип поста order и не мог понять, почему ничего не работает.
Этот пример очень упрощён. На моем блоге вы также найдете полную документацию функции register_post_type() с подробным описанием её параметров и их значений.
Если не знаете, куда вставлять код из этого поста, вставляйте всё в файл functions.php. Таких файлов может быть несколько, нам нужен тот, который находится непосредственно в папке с текущей темой.
В результате получаем:

Круто, да?
Шаг 2. Тексты уведомлений для типа постов
В принципе обычно бывает достаточно первого и четвертого шага, однако, если вы всерьез занялись настройкой админки, то шаги 2 и 3 тоже важны.
Наверное вы понимаете, о каких уведомлениях идет речь. Это сообщения, которые появляются в верхней части экрана при например сохранении или обновлении поста.

Если вы пропустите этот шаг, то по умолчанию будут использоваться уведомления из записей типа post.
add_filter( 'post_updated_messages', 'true_post_type_messages' ); function true_post_type_messages( $messages ) { global $post, $post_ID; $messages['functions'] = array( // functions - название созданного нами типа записей 0 => '', // Данный индекс не используется. 1 => sprintf( 'Функция обновлена. <a href="%s">Просмотр</a>', esc_url( get_permalink($post_ID) ) ), 2 => 'Параметр обновлён.', 3 => 'Параметр удалён.', 4 => 'Функция обновлена', 5 => isset($_GET['revision']) ? sprintf( 'Функция восстановлена из редакции: %s', wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => sprintf( 'Функция опубликована на сайте. <a href="%s">Просмотр</a>', esc_url( get_permalink($post_ID) ) ), 7 => 'Функция сохранена.', 8 => sprintf( 'Отправлено на проверку. <a target="_blank" href="%s">Просмотр</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 9 => sprintf( 'Запланировано на публикацию: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Просмотр</a>', date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), 10 => sprintf( 'Черновик обновлён. <a target="_blank" href="%s">Просмотр</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), ); return $messages; } |
Шаг 3. Вкладка «Помощь»
Вкладка «Помощь» находится в правой верхней части экрана. Для нашего типа поста её ещё пока что нет, но вы сможете найти её на странице редактирования записей например.

Да, содержимое этой вкладки мы тоже можем настроить. Это обычно бывает полезно при работе с клиентами, для которых админка WordPress нелегка в освоении. Туда можно засунуть какую-нибудь справочную информацию и не только.
Следующий код будет работать в версиях WordPress 3.3 и выше. Более старые версии WordPress в данном случае рассматривать не вижу смысла.
function true_post_type_help_tab() { $screen = get_current_screen(); // Прекращаем выполнение функции, если находимся на страницах других типов постов if ( 'functions' != $screen->post_type ) return; // Массив параметров для первой вкладки $args = array( 'id' => 'tab_1', 'title' => 'Обзор', 'content' => '<h4>Обзор</h4><p>Содержимое первой вкладки.</p>' ); // Добавляем вкладку $screen->add_help_tab( $args ); // Массив параметров для второй вкладки $args = array( 'id' => 'tab_2', 'title' => 'Доступные действия', 'content' => '<h4>Доступные действия с типом постов «' . $screen->post_type . '»</h4><p>Содержимое второй вкладки</p>' ); // Добавляем вторую вкладку $screen->add_help_tab( $args ); } add_action('admin_head', 'true_post_type_help_tab'); |
При использовании этого кода получаем:

Шаг 4. Обновление постоянных ссылок
Завершающий штрих. Если на вашем сайте включены пермалинки, то, для того, чтобы страницы типа поста корректно отображались (и отображались вообще), переходим в Параметры > Постоянные ссылки и, ничего не меняя, нажимаем «Сохранить изменения».
Смотрите также
misha.blog
get_posts() - вывод постов в WordPress
Блог / Кодекс WordPress / get_posts() — позволяет получить массив из объектов постов, соответствующих заданным параметрамФункция возвращает массив, содержащий объекты постов (записей, страниц, вложений, произвольных типов постов или всё сразу), соответствующие заданным параметрам. Прежде всего хочу сказать — если вам нужно вывести посты, то рассмотрите использование WP_Query для этих целей.
Имеет следующие значения параметров по умолчанию:
$params = array( 'post_type' => 'post', // тип постов - записи 'numberposts' => 5, // получить 5 постов, можно также использовать posts_per_page 'orderby' => 'date', // сортировать по дате 'order' => 'DESC', // по убыванию (сначала - свежие посты) 'suppress_filters' => true // 'posts_*' и 'comment_feed_*' фильтры игнорируются ); |
Соответствия параметров get_posts() и WP_Query
Любой из параметров WP_Query прекрасно подойдет и для get_posts(). Кроме того, функция имеет несколько эквивалентных параметров:
numberposts | posts_per_page |
category | cat |
include | post__inТакже устанавливает значение posts_per_page равным количеству перечисленных постов. |
exclude | post__not_in |
То есть в принципе вы можете не использовать параметры из первой колонки таблицы вообще, но если вы увидите их где-то в коде, то уже точно будете знать, что они означают.
Примеры использования get_posts()
Для начала самый простой пример — выведем ссылки на 5 последних опубликованных постов на блоге. Для получения URL постов нам также потребуется функция get_permalink().
$recent_posts_array = get_posts(); // получаем массив постов foreach( $recent_posts_array as $recent_post_single ) : // для каждого поста из массива echo '<a href="' . get_permalink( $recent_post_single ) . '">' . $recent_post_single->post_title . '</a>'; // выводим ссылку endforeach; // конец цикла |
Аналогичный пример, но с использованием функция the_permalink() (для вывода урл) и the_title() (для вывода заголовков).
<?php $params = array( 'posts_per_page' => 5 // этот параметр не обязателен, так как get_posts() по умолчанию и так выводит 5 постов ); $recent_posts_array = get_posts( $params ); foreach( $recent_posts_array as $recent_post_single ) : setup_postdata( $recent_post_single ); // устанавливает $post (глобальная переменная - объект поста) ?><a href="<?php the_permalink() /* URL записи */ ?>"><?php the_title() /* выводим заголовок */ ?></a><?php endforeach; wp_reset_postdata(); // сбрасывает $post |
Больше примеров смотрите здесь.
misha.blog
как создать или обновить пост в WordPress
Блог / Кодекс WordPress / wp_insert_post() — функция позволяет создать новую запись / страницу или обновить уже существующуюФункция вставляет посты (записи, страницы, произвольные типы постов) в базу данных WordPress. В случае успеха возвращает ID поста, в случае неудачи либо 0 либо объект WP_Error ( в зависимости от значения второго параметра ).
Если же вам нужно сделать несколько записей, то просто запустите эту функцию в цикле PHP.
wp_insert_post( $postarr, $wp_error = false ) |
Если установлено future (запланированная публикация в будущем), то время публикации post_date (этот параметр дан ниже) должно быть соответствующим.
По умолчанию — draft, то есть, если вы не укажете этот параметр, то пост создастся как черновик.
post_type Тип поста. Например post — запись (по умолчанию), page — страница. post_author Автор поста, а точнее его ID (по умолчанию — текущий пользователь, который авторизован). ping_status Пингбэки и трэкбеки:- open — разрешены,
- closed — запрещены.
По умолчанию — значение get_option('default_ping_status') (находится в Настройки > Обсуждение, скриншот ниже).

http://rpc.weblogs.com/RPC2 http://bing.com/webmaster/ping.aspx |
Если тип поста — не страницы page, значение этого параметра будет проигнорировано.
$wp_error true — возвращать объект WP_Error в случае неудачи (по умолчанию — false).Примеры
Создаем пост и присваиваем ему рубрики и метки
$my_postarr = array( 'post_title' => 'Новый пост', 'post_content' => 'Это мой новый пост.', // контент 'post_status' => 'publish' // опубликованный пост ); // добавляем пост и получаем его ID $my_post_id = wp_insert_post( $my_postarr ); // присваиваем рубрику к посту (ссылка на документацию wp_set_object_terms() дана чуть выше) wp_set_object_terms( $my_post_id, 5, 'category' ); // присваиваем метки wp_set_object_terms( $my_post_id, array(7, 8), 'post_tag' ); |
Как изменить заголовок поста через функцию?
Этим способом вы также сможете изменить и другие параметры поста, упомянутые в статье.
$updated_post_arr = array( 'ID' => 500, // допустим, ID поста, заголовок которого нужно изменить, равен 500 'post_title' => 'Новый заголовок' // заголовок ); // обновляем пост (все остальные его параметры останутся прежними) wp_insert_post( $updated_post_arr ); |
misha.blog