Wp insert post


Алоха ребята! Долго думал, о чем же таком поведать и решил поделиться тем, с чем сам в свое время сталкивался: добавление записей на сайт не заходя в админ панель. В моем случае я нуждался дать возможность пользователям добавлять материал на сайт, но не хотел, чтобы они заходили в админку. Есть пару плагинов, которые решали мою проблему, но плагины были недостаточно гибкими под мои требования, и я решил искать другой метод. После некоторого времени поисков наткнулся на функцию wordpress wp_insert_post(). В этом уроке я покажу вам, как создать свою уникальную форму добавления новостей, используя данную функцию.

1. Создаем форму добавления

Я использовал онлайн генератор для создания форм под bootstrap. Вы можете использовать любой другой либо написать форму самостоятельно. Я же делаю это для примера, поэтому генератор сойдет ? Мы будем отправлять данные формы в другой файл, поэтому тег form должен содержать в себе method=“post” action=“handler.php”, где action – это название обработчика, на который мы отправим данные. Форму копируем, и вставим в файл который мы создадим ниже.


Если вы хотите использовать полноценный текстовые редактор, то в уроке, как использовать функцию wp_editor, я рассказывал, как внедрить редактор в вашу форму добавления.

 <meta charset="utf-8" />  <form method="post" action="<?php bloginfo('template_url'); ?>/handler.php" class="form-horizontal"> <fieldset>  <!-- Form Name --> <legend>Form Name</legend>  <!-- Text input--> <div class="form-group">  <label class="col-md-4 control-label" for="title">Заголовок</label>  <div class="col-md-4">  <input id="title" name="title" type="text" placeholder="Введите заголовок" class="form-control input-md">  <span class="help-block">Краткое название статьи</span>  </div> </div>  <!-- Select Basic --> <label class="col-md-4 control-label" for="cat">Категория</label> <?php wp_dropdown_categories('hide_empty=0&title_li=&name=cat&hierarchical=1&exclude=1'); ?>  <!-- Textarea --> <div class="form-group">  <label class="col-md-4 control-label&quo.  

="btn btn-primary">Отправить</button> </div> </div> </fieldset> </form>

2. Создаем файл для формы

Для того, чтобы внедрить форму, нужно зайти в Админ панель СтраницыДобавить новую и дать название странице, например “Добавить”, после чего сохранить. Далее нужно создать файл – шаблон для этой страницы. Подключаемся по фтп к серверу, где вы разместили ваш сайт, заходим в папку с шаблоном и создаем файл с названием add.php или любое другое, главное, чтобы вы понимали, что это за файл.

Открываем файл, вставляем в него ранее сгенерированную форму. Перед формой вначале файла вставляем

<?php /* Template Name: AddPost*/ ?> 

После данного кода вставляем форму.

AddPost – это название, которое будет отображаться в выборе шаблона.

3. Выбор шаблона для страницы

Заходим через админ панель в ранее созданную страницу “Добавить” и в выпадающем меню с правой стороны выбираем шаблон AddPost, который мы создали в предыдущем пункте. Сейчас, если мы просмотрим страницу “Добавить”, то увидим форму, которую генерировали в первом пункте.


Wp insert post

4. Обработчик формы

В папке с шаблоном создаем файл handler.php, в который вставляем код

<?php /* Define these, So that WP functions work inside this file */ define('WP_USE_THEMES', false); require( $_SERVER['DOCUMENT_ROOT'] .'/wp-blog-header.php'); ?> <?php if(isset($_POST['send']) == '1') {  $post_title = $_POST['title'];  $post_category = $_POST['cat'];  $post_content = $_POST['description'];   $new_post = array(  'ID' => '',  'post_author' => $user->ID,  'post_category' => array($post_category),  'post_content' => $post_content,  'post_title' => $post_title,  'post_status' => 'publish'  );   $post_id = wp_insert_post($new_post);   // This will redirect you to the newly created post  $post = get_post($post_id);  wp_redirect($post->guid); } ?> 

Ну вот и все, наша простенькая форма для добавления записей из фронтенда готова. Саму форму вы можете внедрить в ваш шаблон. Для этого вставьте её в файл add.php вместо <?php the_content(); ?>. вставьте форму. Буду рад ответить на ваши вопросы, если таковы будут ? Не забываем делиться этой записью в социальных сетях, буду очень благодарен!


[sociallocker id=”2203″]Скачать[/sociallocker]

wp-query.ru

Создание результата вызова AJAX () в Cross-Origin Request Blocked error Контактная форма с reCaptcha Функциональный тестовый сервер Symfony2 с параметром SERVER_NAME PHP DOMDocument перемещает узлы из документа в другой Отображать данные, собранные с MYSQL на страни.


434;ный вид из этого набора результатов на основе алгоритма обхода дерева? В чем разница между «<>» и «! =»? php 5.4 Принудительное смещение строки Каков наилучший способ передаD.

447;ты Mandrill Символическая доктрина Создание «робота» для заполнения формы несколькими страницами в Вызов конструктора из аргументов переменной с помощью PHP

ruphp.com

Я создал пользовательский тип сообщения wrestling


и создал соответствующие пользовательские поля, используя дополнительные пользовательские поля. Теперь я хотел, чтобы пользователи заполнили эту настраиваемую форму на передней панели, чтобы при отправке данные автоматически обновлялись в настраиваемом типе сообщений в панели управления. Для этой цели я создал пользовательскую страницу и назначил для нее настраиваемый шаблон, содержащий требуемую форму. Есть четыре поля формы HTML, которые должны заполнять пользователи, называемые name, venue, main_event и fee соответственно.

Поля пользовательских форм, созданные мной с использованием дополнительных пользовательских полей, называются promotion_name, venue, main_event_ и price соответственно. Теперь, чтобы заполнить данные, введенные пользователями на передней панели, в поля пользовательского типа сообщения на панели управления, я попытался использовать функцию wp_insert_post() следующим образом:

$post_information = array(  'promotion_name' => $_POST['name'],  'venue' => $_POST['venue'],  'main_event_' => $_POST['main_event'],  'price' => $_POST['fee'],  'post_type' => 'wrestling',  );   wp_insert_post( $post_information ); 

Однако после того, как пользователь отправит форму, в моем настраиваемом типе сообщений появляется новая запись (no_title), но поля пользовательской формы по-прежнему пусты (см. изображения ниже:)


введите описание изображения здесь» />

введите описание изображения здесь» />

Я уверен, что это связано с тем, что я неправильно использую wp_insert_post() для обновления пользовательских типов сообщений. Я бы очень признателен за помощь здесь. Спасибо.

PS: Вот как я определил свой пользовательский тип сообщения в functions.php:

<?php  function wrestling_show_type() {  register_post_type('wrestling',  array('labels' => array('name' => 'Wrestling Shows', 'singular_name' => 'Wrestling Show'),  'public' => true,  'has_archive' => true,  'rewrite' => array('slug' => 'wrestling')));   flush_rewrite_rules(); } add_action('init', 'wrestling_show_type'); ?> 

qaru.site

Переношу сайт-каталог на платформу WordPress.
В итоге в WordPress имеется 4580 рубрик, с вложенностью до 4-х уровней.
А также в результате переноса должно быть создано более 50 тыс. записей.
Код создания записи выглядит примерно так:

 

<?php function saveSchool($url) { $start_time = microtime(true); // здесь подготовка переменных для массива $post - не интересно... $post = array( 'comment_status' => 'open', 'ping_status' => 'open', 'post_author' => 1, 'post_category' => array($this->currCatId), 'post_content' => $content, 'post_date' => $date_pub, 'post_date_gmt' => gmdate('Y-m-d H:i:s', strtotime($date_pub)), 'post_excerpt' => '', 'post_name' => '', 'post_status' => 'publish', 'post_title' => $title, 'post_type' => 'post', ); $post_id = wp_insert_post( $post ); if (!is_wp_error($post_id) && $post_id > 0) { add_post_meta($post_id, 'url', $url); add_post_meta($post_id, 'address', $data['address']); add_post_meta($post_id, 'phone', $data['phone']); $this->_echo("Запись $post_id сохранена" . sprintf(" - %.3f с", microtime(true)-$start_time)); } else { $this->_echo("ОШИБКА создания поста: {$article['title']} / " . $post_id->get_error_message(), 'red'); $this->_log("ОШИБКА создания поста: {$article['title']} / " . $post_id->get_error_message()); return null; } }

Однако столкнулся с такой ситуацией: изначально время выполнения wp_insert_post стало расти!
Сейчас скрипт продолжает работать, в базу добавлено всего то 2000 записей, а функции wp_insert_post и add_post_meta выполняются по 10 секунд и время растет каждый раз при увеличении количества записей.


Время выполнения трех функций add_post_meta() не более 0,05 секунд., проблема в wp_insert_post()

Удивительно еще и то что встречаются wp_insert_post() вставляющие запись за 0.440 секунд, на ряду с другими, которые делают это за более чем 10 секунд.

Я сначала думал что это какой-нибудь плагин у меня такую доп. нагрузку на wp_insert_post создает, отключил все плагины, удалил все ping-сервисы, естественно отключил механизм ревизий записей в WordPress — но ничего не помогло. Ясное дело что проблема в wp_insert_post и add_post_meta, неужели придется реализовывать вставку через прямые SQL-запросы не используя функционал WordPress ? Может есть какие-то подводные камни у wp_insert_post или с таблицей posts нужно что-то сделать? Может настройки MySQL подкрутить?

toster.ru

We were recently in a situation in a project where we wanted to rebuild/invalidate a cache when a particular post was updated. Some of the key data for the post is stored in postmeta. So we have code that looks like:

  $id = wp_insert_post( wp_slash( array(   'post_title' => 'foo',  ) ) );  /* ... */  update_postmeta( $id, 'bar', wp_slash( $bar ) );  update_postmeta( $id, 'baz', wp_slash( $baz ) );  wp_set_object_terms( $id, $tags, 'post_tag' );  

The problem here is that we can’t reliably use the save_post action to flush the cache because all of the data is not yet written to the database since this action is fired in wp_insert_post(). In other words, the post writing was not atomic, so we had to an additional ad hoc action like do_action( 'acme_after_update_postmeta', $id ) and hook into that action to flush the cache.

I should have been using this already, but it turns out that all of these update_postmeta() and wp_set_object_terms() calls can be made by wp_insert_post() (and wp_update_post()) by using the meta_input and tax_input args:

  @type array $tax_input Array of taxonomy terms keyed by their taxonomy name. Default empty.  @type array $meta_input Array of post meta values keyed by their post meta key. Default empty.  

So the above can be re-written as:

  wp_insert_post( wp_slash( array(   'post_title' => 'foo',   'meta_input' => array(   'bar' => $bar,   'baz' => $baz,   ),   'tax_input' => array(   'post_tag' => $tags,   ),  ) ) );  

With this “atomic” call, we can then listen for a single save_post action and be assured that all of the required postmeta will be available.

Not that I am explicitly using wp_slash() in the examples here as a reminder that these functions expect slashed data, aggravatingly (for backwards compatibility since PHP a long time ago used to espouse the use of “magic quotes”).

make.xwp.co

Скажем, у меня есть сообщение с тегом img, как это:

<img alt="wikipic" class="aligncenter lazy" width="728" height="546" src="http://img.wordpressask.com/posts/loading.gif" data-original="http://img.wordpressask.com/posts/928_2.jpg" > 

wp_insert_post автоматически изменит его на:

  • Шаблон страницы с разным содержимым страницы и сообщения
  • Пользовательские сообщения в разных колонках
  • Обновление страницы появляется в режиме предварительного просмотра, но не в режиме реального времени?
  • сообщение в подкатегорию и родительский элемент в wp_insert_post
  • Как установить шаблон для индивидуального сообщения типа «персонализированный пост»
  • Проверьте, есть ли у почты дети или нет
 <img alt="wikipic" class="aligncenter lazy" width="728" height="546" src="http://img.wordpressask.com/posts/loading.gif"> 

Часть данных-original = "http://img.wordpressask.com/posts/928_2.jpg" исчезла.

Аргументы, которые я использовал в wp_insert_post, приведены ниже:

 $post_info = array( 'post_status' => 'draft', 'post_type' => 'knowhow', 'post_author' => 1, 'ping_status' => get_option( 'default_ping_status' ), 'comment_status' => get_option( 'default_comment_status' ), 'post_pingback' => get_option( 'default_pingback_flag' ), 'post_parent' => 0, 'menu_order' => 0, 'to_ping' => '', 'pinged' => '', 'post_password' => '', 'guid' => '', 'post_content_filtered' => '', 'post_excerpt' => $post_excerpt, 'import_id' => 0, 'post_content' => $post_content, 'post_title' => $post_title, 'post_category' => array($post_category_id), 'post_name' => trim($post_name), //'post_date_gmt' => get_gmt_from_date(gmdate('Ymd H:i:s', $post_time + ( get_option( 'gmt_offset' ) * 3600 ))), //'post_date' => gmdate('Ymd H:i:s', $post_time + ( get_option( 'gmt_offset' ) * 3600 )), 'tags_input' => array_unique(array_filter(explode(',', $tags))), //'tags_input' => $tags, ); $pid = wp_insert_post($post_info); 

Я проверил https://codex.wordpress.org/Writing_Code_in_Your_Posts, а также https://stackoverflow.com/questions/10942170/how-to-prevent-tinymce-editor-within-wordpress-from-changing-the-html- разметки без везения.

И также я подтвердил следующее:

1. Это не браузер.

2. Ни одна из этих трех работ.

 remove_filter('the_content', 'wpautop'); remove_filter("the_content", "wptexturize"); remove_filter("the_content", "convert_chars"); 

3.Это происходит только при использовании wp_insert_post, чтобы добавить сообщение вместо mannual.

В конце дня я знаю, что всегда могу добиться этого, используя js и фильтр содержимого.

Но я просто хочу понять, почему WordPress удаляет пользовательские атрибуты img.

Кто-нибудь знает, почему, я посмотрел всюду.

Solutions Collecting From Web of «wp_insert_post автоматически изменяет мое сообщение»

www.wordpressask.com

Добавление основных полей поста вордпресса средствами php

Подключаем файл инициализации движка WordPress wp-load.php, используем функцию вордпресса wp_insert_post() для добавления поста. Вот что у меня получилось на начальном этапе:

  <?php  require_once( dirname(__FILE__) . '/wp-load.php' );  require_once( dirname(__FILE__) . '/wp-admin/includes/admin.php');    $post_data = array(   'post_title' => 'Новый тестовый пост',   'post_content' => 'Контент тестового поста',   'post_status' => 'publish',   'post_author' => 1,   'post_category' => array(1)  );    // Вставляем запись в базу данных  $post_id = wp_insert_post($post_data, true);  print_r($post_id); // Выведет id-ник поста, либо объект с массивом ошибок  

Мой массив $post_data имеет минимальный набор значений. Для того, чтобы узнать о всех возможных параметрах, смотрите документацию по функции wp_insert_post().

Откройте браузер и зайдите по адресу "http://ваш_домен/upload-post.php". Если скрипт отработал успешно — появиться цифра. Перейдите на главную страницу блога — новая запись должна появиться.

Добавление дополнительных полей в запись wordpress средствами php

Если у Вас навороченный сайт на wordpress, вряд ли Вам хватает основных полей записи блога. В ход идут Custom Fields — произвольные поля. Давайте разберёмся, как их добавлять средствами php. Предположим, что все дополнительные поля уже настроены через админку wodpress, и нам просто нужно вставить значения для этих полей в добавляемом посту.

Для этой цели мы используем метод update_post_meta().  Добавляем к существующему коду функцию, изменяющую значение произвольного поля в добавленном посте:

  <?php   require_once(dirname(__FILE__) . '/wp-load.php');  $post_data = array(   'post_title' => 'Новый тестовый пост с дополнительным полем',   'post_content' => 'Контент тестового поста с дополнительным полем',   'post_status' => 'publish',   'post_author' => 1,   'post_category' => [1]  );     // Вставляем запись в базу данных  $post_id = wp_insert_post($post_data, true);     // Задаём значение для дополнительного поля:  // В одном из моих блогов есть дополнительное поле rating (числовое).  // Его мы и зададим. Для примера, выставим значение 80  update_post_meta($post_id , 'rating', 80);   // Второе поле - строковое - postscriptum  update_post_meta($post_id , 'postscriptum', 'Спасибо за внимание. Подписывайтесь на мой блог');     

Добавление картинки в WordPress средствами php

Допустим нам нужно залить и прикрепить обложку к записи wordpress. Для этого нам нужно: 1) Скачать картинку по ссылке и сохранить её в папку uploads. 2) Добавить загруженный файл в медиатеку WordPress. 3) Назначить сохранённый в медиатеку элемент в качестве обложки поста. Для этого нам понадобятся функции download_url() и media_handle_sideload(). Добавляем в auto-poster.php следующий код:

  // ... добавляем в уже созданный upload-post.php код:    // Для примера возьмём картинку с моего же блога, которая была залита вне структуры wordpress  $url = 'http://sergeivl.ru/public/img/svlJForm.png';    // Прикрепим к ранее сохранённому посту  //$post_id = 3061;  $description = "Картинка для обложки";    // Установим данные файла  $file_array = array();  $tmp = download_url($url);    // Получаем имя файла  preg_match('/[^?]+.(jpg|jpe|jpeg|gif|png)/i', $url, $matches );  $file_array['name'] = basename($matches[0]);  $file_array['tmp_name'] = $tmp;    // загружаем файл  $media_id = media_handle_sideload( $file_array, $post_id, $description);    // Проверяем на наличие ошибок  if( is_wp_error($media_id) ) {  	@unlink($file_array['tmp_name']);  	echo $media_id->get_error_messages();  }    // Удаляем временный файл  @unlink( $file_array['tmp_name'] );    // Файл сохранён и добавлен в медиатеку WP. Теперь назначаем его в качестве облож  set_post_thumbnail($post_id, $media_id);

Запускам, проверяем, радуемся. Принцип я показал. А дальше можете оформлять в виде плагина, писать парсеры с автоматическим добавлением записей в wordpress. Исходник скрипта в моём репозитории на GitHub.

sergeivl.ru

Wp insert post

Всем йоханга!
Сегодня будем решать не простую задачу добавления поста с лицевой части сайта на WordPress, да еще и с помощью ajax, и не просто поста, а поста произвольного типа. В одной из прошлых статей мы разобрались как быстро создать таксономии, посты произвольного типа, запилить к ним шаблоны и форму добавления, но этот случай добавления очень простой, работает на API плагина PODS и не освещает кучу подводных камней и сейчас мы это исправим и заодно разберемся как правильно юзать аякс в WordPress.

Итак, задача:

  • Сделать возможность добавления поста произвольного типа с фронт-энда, минуя админку.
  • Все должно работать без перезагрузки страницы, т.е. на аяксе.
  • Посты, помимо стандартных полей, имеют дополнительные поля, а также поле множественной загрузки картинок.
  • При добавлении, посты должны привязываться к терминам(элементам) таксономии, тоже произвольной.
  • Использовать можно только нативные механизмы WP.

У нас есть произвольный тип постов с полями:

  • заголовок(стандартное поле — post_title),
  • текст(стандартное — post_content),
  • миниатюра(стандартное поле типа файл, потом будем получать id загруженного файла — _thumbnail_id),
  • обычная строка(произвольное поле типа строка — string_field),
  • форматированный текст(произвольное, текстарея — text_field),
  • поле множественной загрузки файлов(произвольное типа файл, дополнительные поля добавляются с помощью jQuery — multifile_field).

Так же посты привязаны к двум произвольным таксономиям:

  • простая таксономия без вложенности, как тэги — custom_tax_like_tag,
  • таксономия с иерархией/вложенностью как у категорий — custom_tax_like_cat.

Причем если пост принадлежит к дочернему термину — он должен принадлежать и к родителю.
Жирным выделено название полей и слаги таксономий.

Решение: сделаем обычную форму со всеми полями, обработаем её отправку с помощью jQuery и плагина jQuery-forms, примем полученные данные по всем правилам работы ajax в WordPress, все проверим, добавим пост с полями и медиафайлами, привяжем к таксономиям и вернем ответ.

Начнем.

0. Подготовим WP для использования аякса:
В WP существует свой механизм работы с аяксом и раз мы используем только стандартное API, то будем делать все по правилам.
Суем это в functions.php нашей темы:

add_action('wp_print_scripts','include_scripts'); // действие в котором прикрепим необходимые js скрипты и передадим данные   function include_scripts(){   wp_enqueue_script('jquery'); // добавим основную библиотеку jQuery   wp_enqueue_script('jquery-form'); // добавим плагин jQuery forms, встроен в WP   wp_enqueue_script('jquery-chained', '//www.appelsiini.net/projects/chained/jquery.chained.min.js'); // добавим плагин для связанных селект листов     wp_localize_script( 'jquery', 'ajaxdata', // функция для передачи глобальных js переменных на страницу, первый аргумент означет перед каким скриптом вставить переменные, второй это название глобального js объекта в котором эти переменные будут храниться, последний аргумент это массив с самими переменными  			array(    				'url' => admin_url('admin-ajax.php'), // передадим путь до нативного обработчика аякс запросов в wp, в js можно будет обратиться к ней так: ajaxdata.url   				'nonce' => wp_create_nonce('add_object') // передадим уникальную строку для механизма проверки аякс запроса, ajaxdata.nonce  			)  		);  }

Теперь у нас подключены нужные плагины и определены глобальные js переменные для граммотной работы с аяксом.

1. Запиливаем форму добавления:
Так как у нас есть вложенная таксономия, для удобства воспользуемся плагином jQuery chained, это для того, чтобы после выбора родительского термина, в следующий селектлист нам добавились только дочерние термины к выбранному. Еще сделаем ссылку, которая будет добавлять нам поля типа файл, для мультизагрузки картинок.
Пусть поля тайтл, постконтент и выборы терминов таксономий будут обязательны.

Ахтунг! Нельзя чтобы атрибут name у контроллов выбора терминов таксономии был таким же как слаг таксономии — вордпресс может пытаться отфильтровать контент по этой таксономии вместо того, что мы хотим.

Код формы:

<?php  // подготовим актуальные данные таксономий  $cats = get_terms('custom_tax_like_cat', 'orderby=name&hide_empty=0&parent=0'); // получим все термины(элементы) таксономии с иерархией  foreach ($cats as $cat) { // пробежим по каждому полученному термину   $parents.="<option value='$cat->term_id' />$cat->name</option>"; // суем id и название термина в строку для вывода внутри тэга select   $childs_array = get_terms('custom_tax_like_cat', 'orderby=name&hide_empty=0&parent='.$cat->term_id); // возьмем все дочерние термины к текущему  	foreach ($childs_array as $child){  		$childs.="<option value='$child->term_id' class='$cat->term_id' />$child->name</option>"; // делаем то же самое, класс должен быть равным id родительского термина чтобы плагин chained работал  	}  }  $tags_array = get_terms('custom_tax_like_tag', 'orderby=none&hide_empty=0&parent=0'); // получим все термины таксономии без вложенности  foreach ($tags_array as $tag) { // пробежим по каждому   $tags .= '<label><input type="radio" name="tag" value="'.$tag->term_id.'">'.$tag->name.'</label>'; // суем все в radio баттоны  }  ?>  <?php // Выводим форму ?>  <form method="post" enctype="multipart/form-data" id="add_object">  	<label>Кастом категории-родители:  		<select id="parent_cats" name="parent_cats" required>  			<option value="">Не выбрано</option>  			<?php echo $parents; // выводим все родительские термины ?>  		</select>  	</label>    	<label>Кастом категории-дети:  		<select id="child_cats" name="child_cats" required>  			<option value="">Не выбрано</option>  			<?php echo $childs; // выводим все дочерние термины, плагин chained сам покажет только нужные элементы в зависимости от выбранного родительского термина ?>  		</select>  	</label>    	Кастом тэги   	<?php echo $tags; // выводим термины таксономии без иерархии в radio ?>    	<label>Тайтл(стандартное) <input type="text" name="post_title" required/></label>  	<label>Пост контент(стандартное) <textarea name="post_content" required/></textarea></label>  	<label>Поле типа строка(произвольное) <input type="text" name="string_field"/></label>  	<label>Пост типа текст(произвольное) <textarea name="text_field"/></textarea></label>  	<label>Миниатюра(стандартное): <input type="file" name="img"/></label>  	<label id="first_img" class='imgs'>Дополнительные фото(произвольное): <input type='file' name='imgs[]'/></label>  	<a href="#" id="add_img">Загрузить еще фото</a>  	<input type="submit" name="button" value="Отправить" id="sub"/>  	<div id="output"></div> <?php // сюда будем выводить ответ ?>

2. Перехват отправки формы и подготовка данных:
Суньте это куда удобнее: прямо на страницу или в специальный js файл для кастом скриптов =)

function ajax_go(data, jqForm, options) { //ф-я перед отправкой запроса   	jQuery('#output').html('Отправляем...'); // в див для ответа напишем "отправляем.."   	jQuery('#sub').attr("disabled", "disabled"); // кнопку выключим  }  function response_go(out) { // ф-я обработки ответа от wp, в out будет элемент success(bool), который зависит от ф-и вывода которую мы использовали в обработке(wp_send_json_error() или wp_send_json_success()), и элемент data в котором будет все что мы передали аргументом к ф-и wp_send_json_success() или wp_send_json_error()  	console.log(out); // для дебага  	jQuery('#sub').prop("disabled", false); // кнопку включим  	jQuery('#output').html(out.data); // выведем результат  }  jQuery(document).ready(function(){ // после загрузки страницы  	jQuery("#child_cats").chained("#parent_cats"); // подключаем плагин для связи селект листов с терминами вложенной таксономии   	add_form = jQuery('#add_object'); // запишем форму в переменную   	var options = { // опции для отправки формы с помощью jquery form   		data: { // дополнительные параметры для отправки вместе с данными формы   			action : 'add_object_ajax', // этот параметр будет указывать wp какой экшн запустить, у нас это wp_ajax_nopriv_add_object_ajax   	nonce: ajaxdata.nonce // строка для проверки, что форма отправлена откуда надо   	},   	dataType: 'json', // ответ ждем в json формате   	beforeSubmit: ajax_go, // перед отправкой вызовем функцию ajax_go()   	success: response_go, // после получении ответа вызовем response_go()   	error: function(request, status, error) { // в случае ошибки   	console.log(arguments); // напишем все в консоль   	},   	url: ajaxdata.url // куда слать форму, переменную с url мы определили вывели в нулевом шаге    };    add_form.ajaxForm(options); // подрубаем плагин jquery form с опциями на нашу форму      jQuery('#add_img').click(function(e){ // по клику на ссылку "Добавить еще фото"   e.preventDefault(); // выключим стандартное поведение ссылки   jQuery(this).before("<label class='imgs'>Дополнительные фото(произвольное) <input type='file' name='imgs[]'/></label>"); // добавим перед ссылкой еще один инпут типа файл с таким же нэймом   });   });

3. Обработка данных и добавление поста:
Это тоже в functions.php

add_action( 'wp_ajax_nopriv_add_object_ajax', 'add_object' ); // крепим на событие wp_ajax_nopriv_add_object_ajax, где add_object_ajax это параметр action, который мы добавили в перехвате отправки формы, add_object - ф-я которую надо запустить  add_action('wp_ajax_add_object_ajax', 'add_object'); // если нужно чтобы вся бадяга работала для админов  function add_object() {  	$errors = ''; // сначала ошибок нет    	$nonce = $_POST['nonce']; // берем переданную формой строку проверки  	if (!wp_verify_nonce($nonce, 'add_object')) { // проверяем nonce код, второй параметр это аргумент из wp_create_nonce  		$errors .= 'Данные отправлены с левой страницы 
'; // пишим ошибку } // запишем все поля $parent_cat = (int)$_POST['parent_cats']; // переданный id термина таксономии с вложенностью (родитель) $child_cat = (int)$_POST['child_cats']; // id термина таксономии с вложенностью (его дочка) $tag = (int)$_POST['tag']; // id обычной таксономии $title = strip_tags($_POST['post_title']); // запишем название поста $content = wp_kses_post($_POST['post_content']); // контент $string_field = strip_tags($_POST['string_field']); // произвольное поле типа строка $text_field = wp_kses_post($_POST['text_field']); // произвольное поле типа текстарея // проверим заполненность, если пусто добавим в $errors строку if (!$parent_cat) $errors .= 'Не выбрано "Кастом категория-родитель"
'; if (!$child_cat) $errors .= 'Не выбрано "Кастом категория-ребенок xD"
'; if (!$tag) $errors .= 'Не выбрано "Кастом тэг"
'; if (!$title) $errors .= 'Не заполнено поле "Тайтл"
'; if (!$content) $errors .= 'Не заполнено поле "Пост контент"
'; // далее проверим все ли нормально с картинками которые нам отправили if ($_FILES['img']) { // если была передана миниатюра if ($_FILES['img']['error']) $errors .= "Ошибка загрузки: " . $_FILES['img']['error'].". (".$_FILES['img']['name'].")
"; // серверная ошибка загрузки $type = $_FILES['img']['type']; if (($type != "image/jpg") && ($type != "image/jpeg") && ($type != "image/png")) $errors .= "Формат файла может быть только jpg или png. (".$_FILES['img']['name'].")
"; // неверный формат } if ($_FILES['imgs']) { // если были переданны дополнительные картинки, пробежимся по ним в цикле и проверим тоже самое foreach ($_FILES['imgs']['name'] as $key => $array) { if ($_FILES['imgs']['error'][$key]) $errors .= "Ошибка загрузки: " . $_FILES['imgs']['error'][$key].". (".$key.$_FILES['imgs']['name'][$key].")
"; $type = $_FILES['imgs']['type'][$key]; if (($type != "image/jpg") && ($type != "image/jpeg") && ($type != "image/png")) $errors .= "Формат файла может быть только jpg или png. (".$_FILES['imgs']['name'][$key].")
"; } } if (!$errors) { // если с полями все ок, значит можем добавлять пост $fields = array( // подготовим массив с полями поста, ключ это название поля, значение - его значение 'post_type' => 'my_custom_post_type', // нужно указать какой тип постов добавляем, у нас это my_custom_post_type 'post_title' => $title, // заголовок поста 'post_content' => $content, // контент ); $post_id = wp_insert_post($fields); // добавляем пост в базу и получаем его id update_post_meta($post_id, 'string_field', $string_field); // заполняем произвольное поле типа строка update_post_meta($post_id, 'text_field', $text_field); // заполняем произвольное поле типа текстарея wp_set_object_terms($post_id, $parent_cat, 'custom_tax_like_cat', true); // привязываем к пост к таксономиям, третий параметр это слаг таксономии wp_set_object_terms($post_id, $child_cat, 'custom_tax_like_cat', true); wp_set_object_terms($post_id, $tag, 'custom_tax_like_tag', true); if ($_FILES['img']) { // если основное фото было загружено $attach_id_img = media_handle_upload( 'img', $post_id ); // добавляем картинку в медиабиблиотеку и получаем её id update_post_meta($post_id,'_thumbnail_id',$attach_id_img); // привязываем миниатюру к посту } if ($_FILES['imgs']) { // если дополнительные фото были загружены $imgs = array(); // из-за того, что дефолтный массив с загруженными файлами в пхп выглядит не так как нужно, а именно вся инфа о файлах лежит в разных массивах но с одинаковыми ключами, нам нужно создать свой массив с блэкджеком, где у каждого файла будет свой массив со всеми данными foreach ($_FILES['imgs']['name'] as $key => $array) { // пробежим по массиву с именами загруженных файлов $file = array( // пишем новый массив 'name' => $_FILES['imgs']['name'][$key], 'type' => $_FILES['imgs']['type'][$key], 'tmp_name' => $_FILES['imgs']['tmp_name'][$key], 'error' => $_FILES['imgs']['error'][$key], 'size' => $_FILES['imgs']['size'][$key] ); $_FILES['imgs'.$key] = $file; // записываем новый массив с данными в глобальный массив с файлами $imgs[] = media_handle_upload( 'imgs'.$key, $post_id ); // добавляем текущий файл в медиабиблиотека, а id картинки суем в другой массив } update_post_meta($post_id,'multifile_field',$imgs); // привязываем все картинки к посту } } if ($errors) wp_send_json_error($errors); // если были ошибки, выводим ответ в формате json с success = false и умираем else wp_send_json_success('Все прошло отлично! Добавлено ID:'.$post_id); // если все ок, выводим ответ в формате json с success = true и умираем die(); // умрем еще раз на всяк случ }

После того как форму отправят, по переданному параметру action вордпресс поймет какой экшн запустить, а именно wp_ajax_add_object_ajax и выполнит нашу функцию add_object(), а дальше все просто.

Ахтунг! Если вы создавали тип постов с помощью плагина Pods, убедитесь что тип постов не имеет обязательных дополнительных полей, иначе функция wp_insert_post вернет кусок несчастья, пост добавится не полностью и ответ в нужном формате тоже не придет.

4. Примечания:

  • Я специально усложнил все насколько смог, чтобы были примеры на все случаи жизни. Очевидно, что для добавления простого поста все проще, но по аналогии.
  • Все таксономии и произвольный тип постов были созданы с помощью плагина Pods Framework за 5 минут. Как работать с этим плагином и какие кнопки нажимать читайте здесь. Если обязательные поля нужны, то для добавления используйте api плагина pods.
  • Очень полезно будет прочитать про ajax в wordpress у Камы.

Ну вот и все. Мы запилили супер добавление кастом постов с произвольными полями, картинками и привязкой к таксономиям через ajax. оО

Шарьте статью, плюсуйте, спрашивайте, всем мир, развлекайтесь)

dontforget.pro


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.