Отправьте идентификатор поста в форму редактирования поста на стороне клиента.

Вопрос или проблема

Я безуспешно пытаюсь передать идентификатор поста на страницу, где отображается форма редактирования на фронтенде с помощью шорткода, и вставить заголовок этого поста в форму. Где я ошибаюсь? Есть какие-нибудь предложения?

Форма для передачи идентификатора поста на страницу редактирования:

<form class="edit-user-post" action="<?php echo home_url( '/edit'); ?>" method="post">
    <!-- получаем ID поста в "postid" и передаем его на страницу "edit" -->
    <input type="hidden" name="postid" value="<?php the_ID(); ?>" />
    <input type="submit"  value="Редактировать" />
</form>

Код редактирования поста на фронтенде (адаптирован из здесь):

class WPSE_Edit_From_Front {
    const NONCE_VALUE = 'front_end_edit_post';
    const NONCE_FIELD = 'feep_nonce';

    protected $pluginPath;
    protected $pluginUrl;
    protected $errors = array();
    protected $data = array();

    function __construct() {
        $this->pluginPath = plugin_dir_path( __file__ );
        $this->pluginUrl  = plugins_url( '', __file__ );

        add_shortcode( 'front_post_edit', array( $this, 'post_shortcode' ) );

        // Слушаем отправку формы & обрабатываем перед выводом заголовков
        add_action( 'template_redirect',  array( $this, 'handleForm' ) );
    }

    /**
     * Шорткоды должны возвращать данные, а не выводить их.
     * 
     * @return string
     */
    function post_shortcode() {
        if ( ! current_user_can( 'publish_posts' ) )
            return sprintf( '<p>Вы должны <a href="https://wordpress.stackexchange.com/questions/212009/%s">войти</a>.</p>', esc_url( wp_login_url(  get_permalink() ) ) );
        elseif ( $this->isFormSuccess() )
            return '<p class="alert-box success"><span>Отлично: </span> Пост был сохранен!</p>';
        else
            return $this->getForm();
    }

    /**
     * Обработка формы и перенаправление при успехе.
     */
    function handleForm() {
        ...
    }

    /**
     * Используйте буферизацию вывода, чтобы *вернуть* HTML формы, а не выводить его.
     * 
     * @return string
     */
    function getForm() {
        ob_start();
        ?>

    <?php foreach ( $this->errors as $error ) : ?>

        <p class="error alert-box"><span>Ошибка: </span><?php echo $error ?></p>

    <?php endforeach ?>

    <form id="edit_post" name="edit_post" method="post" action="" enctype="multipart/form-data">
        <fieldset>
            <!-- Название элемента -->
            <label for="item_name">Заголовок<span class="required">*</span></label>
            <input type="text" name="item_name" id="item_name" title="Редактировать заголовок" value="<?php

                // "Липкое" поле, сохранит значение из последнего POST, если были ошибки
                if ( isset( $this->data['item_name'] ) ) {
                    echo esc_attr( $this->data['item_name'] );
                } else {
                    echo $data->post_title;
            }

            ?>" />

            <!-- Кнопка отправки -->
            <label for="submitForm"></label>
            <div class="submitForm-wrapper">
                <button type="submit" name="submitForm" id="submitForm" title="Сохранить пост">Сохранить</button>
            </div>
        </fieldset>

        <?php wp_nonce_field( self::NONCE_VALUE , self::NONCE_FIELD ) ?>
    </form>

        <?php
        return ob_get_clean();
    }

    /**
     * Форма была отправлена?
     * 
     * @return bool
     */
    function isFormSubmitted() {
        return isset( $_POST['submitForm'] );
    }

    /**
     * Форма была успешно обработана?
     *
     * @return bool
     */
    function isFormSuccess() {
        return filter_input( INPUT_GET, 'success' ) === 'true';
    }

    /**
     * Поле nonce допустимо?
     * 
     * @return bool
     */
    function isNonceValid() {
        return isset( $_POST[ self::NONCE_FIELD ] ) && wp_verify_nonce( $_POST[ self::NONCE_FIELD ], self::NONCE_VALUE );
    }
}

new WPSE_Edit_From_Front;

Идентификатор поста передается корректно. Что мне нужно было сделать, так это добавить следующий код в функцию getForm(), перед ob_start():

$post_to_edit = array();
$post_to_edit = get_post( $_POST['postid'] );
$this->data['item_name'] = $post_to_edit->post_title;

Ответ или решение

Вопрос о том, как передать идентификатор поста на страницу с формой редактирования, а также о корректной вставке заголовка поста в форму, является важным аспектом работы с WordPress. Давайте разберем шаги, которые необходимы для правильной реализации данной функции.

Шаг 1: Передача идентификатора поста через форму

Ваш HTML-код формы для передачи идентификатора поста выглядит следующим образом:

<form class="edit-user-post" action="<?php echo home_url('/edit'); ?>" method="post">
    <input type="hidden" name="postid" value="<?php the_ID(); ?>" />
    <input type="submit" value="Edit" />
</form>

Этот код создает скрытое поле, в которое помещается идентификатор поста, используя функцию the_ID(). Убедитесь, что этот код размещен внутри цикла WordPress, чтобы функция могла корректно получать идентификатор текущего поста.

Шаг 2: Получение данных поста на странице редактирования

Чтобы получить заголовок поста и другие данные на странице редактирования, вам нужно модифицировать функцию getForm() в вашем классе WPSE_Edit_From_Front. Важно, чтобы ID поста был корректно получен из переданных данных, и на его основе выводился заголовок поста в форме.

Вот обновленный код для функции getForm():

function getForm() {
    if ( isset($_POST['postid']) ) {
        $post_to_edit = get_post( $_POST['postid'] );
        // Сохраним заголовок поста для отображения в форме
        $this->data['item_name'] = $post_to_edit->post_title;
    }

    ob_start();
    ?>

    <?php foreach ($this->errors as $error) : ?>
        <p class="error alert-box"><span>Error: </span><?php echo $error ?></p>
    <?php endforeach; ?>

    <form id="edit_post" name="edit_post" method="post" action="" enctype="multipart/form-data">
        <fieldset>
            <label for="item_name">Title<span class="required">*</span></label>
            <input type="text" name="item_name" id="item_name" title="Edit the title" value="<?php echo isset($this->data['item_name']) ? esc_attr($this->data['item_name']) : ''; ?>" />
            <div class="submitForm-wrapper">
                <button type="submit" name="submitForm" id="submitForm" title="Save the post">Save</button>
            </div>
        </fieldset>

        <?php wp_nonce_field(self::NONCE_VALUE, self::NONCE_FIELD); ?>
    </form>

    <?php
    return ob_get_clean();
}

Шаг 3: Проверка безопасности и обработка формы

Также важно убедиться, что ваша форма защищена от CSRF-атак. Вы уже используете проверку nonce, что является правильным шагом. Убедитесь, что перед отправкой формы пользователь прошел авторизацию и имеет соответствующие права доступа к редактируемым постам.

Заключение

Убедитесь, что вы корректно настроили весь процесс: от передачи идентификатора поста до его получения и отображения в форме. Если все шаги будут выполнены правильно, ваша система редактирования постов на фронтенде будет работать эффективно и безопасно. Использование WordPress API для работы с постами обеспечивает вам необходимую гибкость и безопасность в управлении контентом.

Это решение не только эффективно, но и поддерживает хорошую практику разработки, что приводит к более устойчивому и безопасному коду.

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

Капча загружается...