Как отправить входные данные из AMP-FORM во внешний API, а также записать в базу данных Wordpress те же данные? - PullRequest
0 голосов
/ 24 октября 2019

Сайт и форма - все AMP-HTML, я пытался использовать admin-post и admin-ajax для отправки в API и сохранения всех входных данных в базе данных Wordpress, мне удалось отправить электронное письмо, исохранить в базу данных, однако, чтобы отправить во внешний API, я не могу понять, что происходит, он не показывает в консоли никаких сообщений об ошибках, так как APM-FORM использует ajax, я не знаю, вызывает ли другой ajax внутривыдает ошибку или нет, не знаю, как это исправить.

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

Мне удалось сохранить данные с помощью CFDB (Контактная форма базы данных), а также отправив электронное письмо с помощью phpmailer. Я использовал как вызовы admin-ajax, так и вызовы admin-post, но безуспешно для отправки на внешний API.

Работа в Linux, PHP 7.3, MariaDB, Apache 2.4 и Nginx.

Пример AMP-FORM с помощью admin-post

<form id="orcamento-form" class="orcamento-form custom-forms"
    method="post"
    on="submit:header-before.hide;submit-success:header-after.show,page.scrollTo(duration=200)"
    custom-validation-reporting="show-all-on-submit"
    action-xhr="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>"
    target="_top">

    <?php wp_nonce_field( 'test_form_action', 'test_form_nonce' ); ?>
    <input type="hidden" name="action" value="form_orcamento">
    <input type="hidden" name="form_type" value="Orçamento">

    <label for="nome">Nome</label>
    <input id="nome" type="text" name="nome" required tabindex="1">
    <span class="warning" visible-when-invalid="valueMissing" validation-for="nome">Campo obrigatório.</span>

    <input type="submit" value="Solicitar Orçamento" tabindex="1">

    <div submitting class="submitting">
        <template type="amp-mustache">
            Olá {{nome}}, estamos processando sua solicitação.
        </template>
    </div>

    <div submit-success class="submit-success">
        <template type="amp-mustache">
            Formulário enviado com sucesso.
        </template>
    </div>
</form>

Пример functions.php

/**
 * Form Up Study Orçamento
 *
 * @return void
 */
function amp_form_orcamento() {

    if ( ! isset( $_POST['test_form_nonce'] ) || ! wp_verify_nonce( $_POST['test_form_nonce'], 'test_form_action' ) ) {
        wp_send_json_error( 'Falha na verificação de nonce.' );
    }

    // Define headers for AMP cross origin.
    header( 'access-control-allow-credentials:true' );
    header( 'access-control-allow-headers:Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token' );
    header( 'access-control-allow-methods:POST, GET, OPTIONS' );
    header( 'access-control-allow-origin:' . $_SERVER['HTTP_ORIGIN'] );
    header( 'access-control-expose-headers:AMP-Access-Control-Allow-Source-Origin' );
    header( 'amp-access-control-allow-source-origin:https://' . $_SERVER['HTTP_HOST'] );
    header( 'Content-Type: application/json' );

    // Initialize phpmailer class.
    global $mailer;

    /* carrega todas variáveis */

    /**
     * Send the Email throught PHPMailer, if success send to the Edvisor API.
     */
    if ( ! $mailer->Send() ) {

        // Deu erro no envio da mensagem pelo PHPMailer.
        wp_send_json(
            array(
                'error'   => $mailer->ErrorInfo, // phpcs:ignore
                'message' => 'Falha ao enviar o email.',
            ),
            400
        );
    } else {

        // Email enviado através do PHPMailer com sucesso, enviar para API Edvisor.
        ?>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    <script type="text/javascript">
    jQuery( document ).ready(function($) {
        var formData = {
            "agencyId"  : 1234,
            "firstname" : "<?php echo esc_html( $firstname ); ?>",
            "lastname"  : "<?php echo esc_html( $lastname ); ?>",
            "email"     : "<?php echo esc_html( $email ); ?>",
        }
        $.ajax({
            url: 'https://app.edvisor.io/api/v1/student?public_key=PUBLIC_KEY',
            data: JSON.stringify(formData),
            type: 'PUT',
            dataType: 'json',
            contentType: 'application/json; charset=UTF-8',
            processData: false
        })
            .done(function(response, textStatus, jqXHR) {
                console.log( 'OK' );
            })
            .fail(function(jqXHR, textStatus, errorThrown) {
                console.log( 'ERROR' );
            });
    });
    </script>
        <?php
    }

    $mailer->ClearAllRecipients();
}
add_action( 'admin_post_nopriv_form_orcamento', 'amp_form_orcamento' );
add_action( 'admin_post_form_orcamento', 'amp_form_orcamento' );

Я не могу понять, что отправляется в API или какие ошибки возвращаются, потому что консоль делаетне показывать ни одного сообщения, оно пустое ...

Я должен увидеть, что API вернул успешный ответ.

...