Categories: Wordpress

Редактирование поста с фронт-енда с помощью Advanced Custom Fields Pro

Продолжая тему создания постов с фронт-енда, предлагаю вашему вниманию инструкцию Редактирование поста с фронт-енда.
За основу использовался пример с сайта The Stiz Media
Итак, Форма создания нового поста с фронт-енда уже создана. Теперь нужно сделать возможность редактирования этого поста.

Шаг1. Добавить форму редактирования в шаблон single.php

Форму редактирования нужно добавить прямо в шаблон single.php. Нужно использовать те же поля, что были созданы при добавлении формы нового поста.
Первым делом в шаблон single.php в самом начале шаблона перед get_header(); нужно добавить acf_form_head();. Выглядеть начало шаблона будет так:

<?php
/**
 * The Template for displaying all single posts.
 *
 * @package Cryout Creations
 * @subpackage nirvana
 * @since nirvana 0.5
 */acf_form_head();
get_header();?>

Далее, в том месте, где необходимо добавить кнопку редактирования поста, добавить следующий код. Лучше всего после <?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>:

<!-- Кнопка редактировать с помощью ACF -->

<?php 
 // Сбор информации о пользователе
 global $post,$current_user;
 get_currentuserinfo();

 
if ( ! ( is_user_logged_in() && $current_user->ID == $post->post_author ) ) {

} else {?>
<!--Скрипт спойлера, Для работы нужен jquery-- >
 <script type="text/javascript">
jQuery(document).ready(function($) {
$(document).ready(function(){
 $('.spoiler_links').click(function(){
  $(this).parent().children('div.spoiler_body').toggle('normal');
  return false;
 });
});
});
</script>
<!--//Скрипт спойлера-->

<div>
<!--Кнопка спойлера-->
<a style="float: right;" href="" >Редактировать</a>
<!--//Кнопка спойлера-->

<!--Форма редактирования в спойлере-->
 <div style="background-color: #FAEBD7; padding: 40px; border-radius: 7px;" class="spoiler_body">

<?php

$edit_post = array(
   'post_id'            => get_the_ID(), // Get the post ID
   'field_groups'       => array(1210, 1215, 1208), // Create post field group ID(s)
   'form'               => true,
   'return'             => '%post_url%',
   'html_before_fields' => '',
   'html_after_fields'  => '',
   'submit_value'       => 'Сохранить изменения'
  );
  acf_form( $edit_post );?>
<br />
<br />
<br />
<br />

Начало Вашего поста: </div><!--Форма редактирования в спойлере-->
</div>
<?php }?></!-- Кнопка редактировать с помощью ACF -->

Традиционно в форме нужно изменить ID групп полей, то есть цифры 1210, 1215, 1208 заменить на свои ID.

Шаг 2. Форма в спойлере

Для того, чтобы форма редактирования была скрыта, в коде предусмотрен спойлер. Сама форма помещена внутрь спойлера. Она появляется после нажатия на кнопку “Редактировать”.
Для работы спойлера нужно, чтобы была подключена библиотека jquery. Обычно она уже подключена по умолчанию. У меня, например, подключена следующая библиотека (код добавляется в function.php):

wp_deregister_script('jquery');
wp_register_script('jquery', 'http://code.jquery.com/jquery-latest.min.js', false, false);
wp_enqueue_script( 'jquery' );

Также для работы спойлера нужно доавить следующие стили:

/* спойлер */.spoiler_body {display:none;}
.spoiler_links {cursor:pointer;}

Шаг 3. Добавить функцию acf/save_post

Для работы формы, нужно добавить функцию в шаблон function.php

//Редактировать пост
function tsm_update_existing_post_data( $post_edit_id ) {

 // Обновить существующий пост
 $post_edit = array(
  'ID'           => $post_edit_id,
  'post_status'  => 'private',
  'post_title'   => wp_strip_all_tags($_POST['acf']['field_54dfc93e35ec4']), // Заголовок ACF field key
  'post_content' => $_POST['acf']['field_5509d61f8541f'], // Содержание ACF field key
 );

 // Update the post
 $post_edit_id = wp_insert_post( $post_edit );

// Изображение ACF field key
 $image_edit   = $_POST['acf']['field_55003d1d76fc1'];

 // Add the value which is the image ID to the _thumbnail_id meta data for the current post
 update_post_meta( $post_edit_id, '_thumbnail_id', $image_edit );

  }
add_action( 'acf/save_post', 'tsm_update_existing_post_data', 10 );


add_action( 'wp_print_styles', 'my_deregister_styles', 100 );

function my_deregister_styles() {
 wp_deregister_style( 'wp-admin' );
}

В коде нужно заменить ключи полей (Fields Key), если вы создавали поля самостоятельно. Если вы импортировали мой файл acf-export.rar ранее, тогда этого делать не нужно так как ключи совпадают.

Теперь зарегистрированные пользователи могут не только добавлять новые посты, но и редактировать их. И для этого не обязательно пускать их в админ-панель.

Демонстрация

View Comments

  • добрый вечер! отличное решение для acf, спасибо! единственное, заметил один момент - при пересохранении поста из фронтенда - сбрасываются все присвоенные ему доп категории, кроме категории по умолчанию. не сталкивались с этим?

  • Я только начал работать с ACF, подскажите, эти примеры универсальны?
    Мне не нужно будет шаблон переписывать под отдельную вновь созданную форму?
    Достаточно будет подставить йд полей?, а вывод форм произайдет автоматически.

    • Сложно сказать до конца - но, по идее да, это пример универсальный.

Recent Posts

  • Excel

Как правильно открыть CSV с многострочными ячейками в Excel

Если при открытие csv файла с помощью excel У все поехали ячейки - это простой… Read More

% дней назад
  • Python

Загрузка проекта на Github и Автодеплой на сервер

Простые шаги как происходит Загрузка проекта на Github и Автодеплой на сервер Сделайте работу проще! Read More

% дней назад
  • Python
  • Полезная минутка

Миграция базы данных в проектах Python

Миграция базы данных - помогают с этим библиотеки SQLAlchemy и Alembic. Read More

% дней назад
  • Python

Команды Git – Шпаргалка по основным командам Git

Основные Команды Git, которые точно пригодятся. Сохрани себе шпаргалку Git Read More

% дней назад
  • Python

Установка PostgreSQL на сервер Ubuntu и подключение через pgAdmin

Установка PostgreSQL на сервер Read More

% дней назад
  • Полезная минутка

Как создать PrimaryKey для таблицы в PostgreSQL

Как создать PrimaryKey в талице базы данных SQL [РЕШЕНО] Ошибка relation tablename_id_seq doesn't exist Read More

% дней назад