Форма сообщений с запросом AJAX — разработка плагинов для WordPress

#php #ajax #wordpress #plugins

Вопрос:

Попытка создать форму с вызовом AJAX на интерфейсе, где пользователи могут отправлять сообщения.

Существует одно текстовое поле, одна текстовая область и одно поле файла.

Вот форма:

 public function pp_html_template() {
    if ( is_user_logged_in() ) {
        return '<h2>' . __( 'Publish your post', 'post-publisher' ) . '</h2>
        <form id="pp-form-submit" class="pp-form-submit" enctype="multipart/form-data">' .
       wp_nonce_field( 'pp_publisher_save', 'pp_publisher_name' )
       . '<div class="pp-row">
                <label for="pp_title">' . esc_attr__( 'Title', 'post-publisher' ) . '</label>
                <input type="text" id="pp_title" name="pp_title">
            </div>

            <div class="pp-row">
                <label for="pp_content">' . esc_attr__( 'Content', 'post-publisher' ) . '</label>
                <textarea name="pp_content" id="pp_content" name="pp_content" cols="30" rows="10"></textarea>
            </div>
            
            <div class="pp-row">
                <label for="pp_featured_image">' . esc_attr__( 'Featured Image', 'post-publisher' ) . '</label>
                <input type="file" id="pp_featured_image" name="pp_featured_image">
            </div>
            <input type="hidden" name="action" value="pp_html_process"/>
            <div class="pp-row">
                <input type="submit" name="pp_submit" id="pp_submit">
            </div>
        </form>';
    }
}
 

Вот процесс обработки:

 public function pp_html_process() {

    // Process the form
    if ( isset( $_POST['pp_submit'] ) ) {
        if ( ! isset( $_POST['pp_publisher_name'] ) || ! wp_verify_nonce( $_POST['pp_publisher_name'], 'pp_publisher_save' ) ) {
            esc_attr__( 'Sorry, this action is not allowed.', 'post-publisher' );
            exit;
        } else {
            global $current_user;

            $user_login   = $current_user->user_login;
            $user_id      = $current_user->ID;
            $post_title   = sanitize_text_field( $_POST['pp_title'] );
            $post_content = sanitize_textarea_field( $_POST['pp_content'] );

            $new_post = array(
                'post_title'   => $post_title,
                'post_content' => $post_content,
                'post_type'    => 'post',
                'post_status'  => 'draft',
                'post_name'    => str_replace( ' ', '-', $post_title ),
            );

            $post_id = wp_insert_post( $new_post, true );

            if ( ! function_exists( 'wp_generate_attachment_metadata' ) ) {
                require_once( ABSPATH . "wp-admin" . '/includes/image.php' );
                require_once( ABSPATH . "wp-admin" . '/includes/file.php' );
                require_once( ABSPATH . "wp-admin" . '/includes/media.php' );
            }


            $featured_image = media_handle_upload( 'pp_featured_image', $post_id );
            if ( $featured_image > 0 ) {
                update_post_meta( $post_id, '_thumbnail_id', $featured_image );
            }
        }
    }
}
 

И construct()

 public function __construct() {
    if ( ! is_admin() ) {
        add_shortcode( 'pp_html_template', array( $this, 'pp_html_template' ) );
        add_action( 'init', array( $this, 'pp_html_process' ) );
    }

    add_action( 'wp_ajax_pp_html_process', array( $this, 'pp_html_process' ) );
    add_action( 'wp_ajax_nopriv_pp_html_process', array( $this, 'pp_html_process' ) );
}
 

АЯКС:

 jQuery(document).ready(function ($) {
    $('#pp-form-submit').submit(ajaxSubmit);

    function ajaxSubmit() {
        var newCustomerForm = $(this).serialize();

        jQuery.ajax({
            type: "POST",
            url: "/codeable/wp-admin/admin-ajax.php",
            data: $("#pp-form-submit").serialize(),
            success: function (response) {
                console.log(response);
            }
        });
        return false;
    }
});
 

Вот запрос на завиток:

 curl 'http://localhost:8888/cdbl/wp-content/plugins/post-publisher/public/assets/js/pp-public-jq.js' 
  -H 'Connection: keep-alive' 
  -H 'Pragma: no-cache' 
  -H 'Cache-Control: no-cache' 
  -H 'sec-ch-ua: "Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"' 
  -H 'sec-ch-ua-mobile: ?0' 
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36' 
  -H 'sec-ch-ua-platform: "macOS"' 
  -H 'Accept: */*' 
  -H 'Sec-Fetch-Site: same-origin' 
  -H 'Sec-Fetch-Mode: no-cors' 
  -H 'Sec-Fetch-Dest: script' 
  -H 'Referer: http://localhost:8888/cdbl/' 
  -H 'Accept-Language: sr-RS,sr;q=0.9,en-US;q=0.8,en;q=0.7,hr;q=0.6,sl;q=0.5,bs;q=0.4,sv;q=0.3,da;q=0.2,pt;q=0.1,fr;q=0.1,he;q=0.1' 
  -H 'Cookie: wordpress_71d96747b9bfc3c631d78d4d4d334cf6=marko|1632206615|tnKvrmSveEtJFS7cJBUwaJgzn0pY2MbblA1yqLiaSQO|cde31e8b50b7181062a7bb780b2cba008918b4f68b644f8ed2de71406ed4fe18; wordpress_test_cookie=WP Cookie check; wp-settings-time-1=1631803323; wp-settings-1=libraryContent=browse; wordpress_logged_in_71d96747b9bfc3c631d78d4d4d334cf6=marko|1632206615|tnKvrmSveEtJFS7cJBUwaJgzn0pY2MbblA1yqLiaSQO|81060441911318c4457ead826c5a3e2aa1cf7fbe6bc8d078b3203eff43cb3178; mp_a36067b00a263cce0299cfd960e26ecf_mixpanel={"distinct_id": "17bf571eeb2d11-0dbb8fc5091344-113f6757-60e640-17bf571eeb36fe","$device_id": "17bf571eeb2d11-0dbb8fc5091344-113f6757-60e640-17bf571eeb36fe","$initial_referrer": "http://localhost:8888/pimodules/wp-login.php","$initial_referring_domain": "localhost:8888"}' 
  --compressed
 

Я не получаю никаких ошибок в консоли. Сообщение без AJAX работает отлично, но с AJAX оно возвращает 0.

Любые советы будут полезны.

Комментарии:

1. распечатайте newCustomerForm на консоли в jquery. Проблема может быть в использовании «этого»

2. Это регистрация данных: pp_publisher_name=9d0fe18945amp;_wp_http_referer=/cle/amp;pp_title=sdfgamp;pp_content=dfgsamp;action=pp_html_process

Ответ №1:

У меня нет полных ваших кодов. Поэтому я дам несколько советов, которые позволят вам решить вашу проблему. Вы можете сделать все это или шаг за шагом:

Добавить action="POST" <form> и удалить enctype="multipart/form-data">

 <form id="pp-form-submit" class="pp-form-submit" action="POST">
 

И вы можете попробовать использовать приведенный ниже код для отправки формы:

 jQuery(document).ready(function ($) {
    $('#pp-form-submit').submit(function (e) {
      e.preventDefault();
      var frmData = new FormData(document.getElementById("#pp-form-submit"));
      $.ajax({
         type: "post",
         contentType: false,
         processData: false,
         url: "/codeable/wp-admin/admin-ajax.php",
         data: frmData,
         success: function (response) {
            console.log(response);
         },
         error: function (req, error) {
            console.log(req, error);
         },
      });
   });
});
 

Если он все еще не работает, вы можете изменить значение url с /codeable/wp-admin/admin-ajax.php на полный URL, например http://localhost/codeable/wp-admin/admin-ajax.php

Вы должны использовать wp_localize_script для добавления URL-адреса admin_ajax в переменные javascript. Например:

 wp_enqueue_script("your_script_name", 'full-path-to-script/script.js', array('jquery'), '1.0', true );
wp_localize_script("your_script_name", 'ajax_variables', array( 
            'ajax_url' => admin_url( 'admin-ajax.php' )
        ));
wp_enqueue_script("your_script_name");
 

Таким образом, вы можете использовать URL-адрес admin-ajax в файле javascript, например:

 $.ajax({
     type: "post",
     contentType: false,
     processData: false,
     url: ajax_variables.ajax_url,
     data: frmData,
     success: function (response) {
        console.log(response);
     },
     error: function (req, error) {
        console.log(req, error);
     },
  });
 

Комментарии:

1. Спасибо за ваше подробное объяснение. Я попытался это сделать, но в этом случае я получаю следующую ошибку в консоли pp-public-jq.js:23 Uncaught TypeError: Failed to construct 'FormData': parameter 1 is not of type 'HTMLFormElement'.

2. @Marko Ну, пожалуйста, помогите удалить # в этой строке. Таким образом, это должно быть: ‘ var frmData = новые данные формы(document.getElementById(«pp-форма-отправить»));’

3. Конечно, я удалил #. В таком случае, вернемся к началу. Он возвращает 0 в консоли.

4. @Marko не могли бы вы показать содержимое запроса? Перейдите в консоль (F12) -> Сеть ->> Щелкните правой кнопкой мыши по запросу ->>> Копировать ->>>> Копировать как CURL (cmd).

5. Я отредактировал свой вопрос, и вы можете найти запрос там. Спасибо