#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();» и посмотреть, работает ли это.