jQuery.post возвращает 0

#jquery #ajax #wordpress #authentication

#jquery #ajax #wordpress #аутентификация

Вопрос:

В настоящее время я работаю над всплывающим окном для входа в WordPress, которое создается как плагин. Я относительно новичок в jQuery и AJAX в частности. У меня небольшая проблема с возвращаемым значением, всегда равным 0, хотя я думаю, что на самом деле это сообщение об успешном завершении, и оно ничего не возвращает.

Любая помощь будет оценена.

1. Определен Ajaxurl

 wp_localize_script(
    'mytheme', 'Params', apply_filters( 'js_params', array(
        'siteUrl' => esc_url( site_url( '/' ) ),
        'homeUrl' => esc_url( home_url( '/' ) ),
        'ajaxUrl' => esc_url( admin_url( 'admin-ajax.php' ) ),
        ),
    ) )
);
 

2. Форма входа в функцию

 function login_form( $atts = array() ) {

    $output = '';

    wp_enqueue_script( 'jquery-ui-tabs', true );
    wp_enqueue_script( 'loginform' );

    $class .= " login-form login-form-container";

    $output .= '<div class="' . $class . '"';

    $output .= '>';
    
    $output .= '<div class="login-form-inner">';

    /* Title */
    $output .= '<div class="login-form-title-container">';
    $output .= '<h3 class="login-form-title">';
    $output .= esc_html__( 'Login' );
    $output .= '</h3>';
    $output .= '</div>';

    ob_start();

    ?>
    <form class="login-form" action="<?php echo esc_url( get_permalink( wc_get_page_id( 'myaccount' ) ) ); ?>" method="post">
            <?php do_action( 'woocommerce_login_form_start' ); ?>

            <p class="login-usernam">
                <label for="username"><?php esc_html_e( 'Username or email address'); ?>amp;nbsp;<span class="required">*</span></label>
                <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
            </p>
            <p class="login-password">
                <label for="password"><?php esc_html_e( 'Password', ); ?>amp;nbsp;<span class="required">*</span></label>
                <input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="current-password" />
            </p>

            <?php do_action( 'woocommerce_login_form' ); ?>

            <p class="login-submit">
                <?php wp_nonce_field( 'woocommerce-login', 'woocommerce-login-nonce' ); ?>
                <input id="wp-submit" type="submit" class="<?php echo apply_filters( 'wvc_login_form_submit_button_class', 'button button-primary' ); ?>" name="login" value="<?php esc_attr_e( 'Log in'); ?>">
            </p>

            <?php do_action( 'woocommerce_login_form_end' ); ?>
        </form>
    <?php

    $output .= ob_get_clean();

    $output .= '</div><!--.login-form-inner-->';

    $output .= '</div><!--.login-form-->';

    return $output;
}
 

3. Обратный вызов функции

 function get_login_form() {

    if ( function_exists( 'login_form' ) ) {
        echo login_form();
    }
    exit;
}

add_action( 'wp_ajax_get_login_form', 'get_login_form' );
add_action( 'wp_ajax_nopriv_get_login_form', 'get_login_form' );
 

4. Jquery

         loginPopup : function() {

            var $body = $( 'body' );

            $( document ).on( 'click', '.account-item-icon-user-not-logged-in, .close-loginform-button', function( event ) {
                event.preventDefault();

                if ( $body.hasClass( 'loginform-popup-toggle' ) ) {

                    $body.removeClass( 'loginform-popup-toggle' );

                } else {
                    
                    $body.removeClass( 'overlay-menu-toggle' );

                    if ( $( '.wvc-login-form' ).length ) {

                        $body.addClass( 'loginform-popup-toggle' );

                    } else {
                        /* AJAX call */
                        $.post( Params.ajaxUrl, { action : 'get_login_form' }, function( response ) {
                            
                            console.log( response );

                            if ( response ) {

                                $( '#loginform-overlay-content' ).append( response );

                                $body.addClass( 'loginform-popup-toggle' );
                            }
                        } );
                    }
                }
            } );
 

Ответ №1:

Функция get_login_form() возвращает значение «exit;». Это должно быть wp_die() , поэтому вы получаете возвращаемое значение 0.

Любые функции php, вызываемые с помощью ajax, должны повторять результат и заканчиваться wp_die() .

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

1. Я пытался wp_die() , но это все равно не работает

2. Ну, помимо отсутствующей функции wp_die() , которая требуется, в вашем коде все еще много ошибок, вы используете ob_get_clean(), но затем добавляете к переменной после этого. get_login_form ДОЛЖЕН возвращаться с помощью wp_die() после повторения любых данных для отправки в ajax-скрипт. Вы также пытаетесь поставить скрипты в очередь в функции, но это совсем другая проблема. Они должны быть в wp_enqueue_scripts .

3. Спасибо за информацию. Не могли бы вы, пожалуйста, помочь мне исправить эти проблемы? Я попробовал еще раз, но он по-прежнему не работает

4. С таким количеством проблем в вашем коде я не думаю, что с моей стороны было бы разумно пытаться переписать его, поскольку я думаю, что вам следует немного лучше ознакомиться с php, wordpress и woocommerce, прежде чем пытаться переделать что-то столь серьезное, как форма входа. Вы открываете себя для многих, многих проблем впереди.

5. Я думаю, что лучшая идея — удалить код формы из функции login_form и заменить его на «echo hi; wp_die();» и посмотреть, работает ли это.