web-dev-qa-db-ja.com

wp_send_json_errorの使用方法

Wp_send_json_errorがエラーメッセージを返すしくみを理解できません。どのエラー条件も満たされない限り、問題なく機能します。ただし、エラーがある場合は何も返されません。

エラーが発生した場合、wp_send_json_error()で設定したエラーメッセージを返すにはどうすればよいですか?

私のコードを参照してください:

function submit_youtube_callback() {
    check_ajax_referer( 'randomnonce', 'security' );

    if (    !isset($_POST['post_id']) || 
            !is_numeric($_POST['post_id']) || 
            !get_post_status($_POST['post_id']) || 

            !isset($_POST['yt_url']) ||
            !isset($_POST['terms'])
            ) {

        wp_send_json_error( 'Error: Invalid data!' );
    }

    // Check if terms are checked
    $terms = $_POST['terms'];
    if ( $terms != true ) {
        wp_send_json_error( 'Error: You must accept the terms.' );
    }

    // Check if valid youtube URL   
    $youtube_url = $_POST['yt_url'];
    $preg = '~^(?:https?://)?(?:www\.)?(?:youtube\.com|youtu\.be)/watch\?v=([^&]+)~x';
    $has_match = preg_match($preg, $youtube_url, $matches); 
    if ( empty($matches[1]) ) {
        wp_send_json_error( 'Error: You did not enter a valid YouTube URL.');
    }   

    echo '<p>youtube: '. $youtube_url .'</p>';  
    echo '<p>terms accepted: ' . $terms .'</p>';

    wp_die();
} add_action( 'wp_ajax_cp_narrations_callback', 'submit_youtube_callback' );

そしてJavaScript:

function submit_youtube_javascript() {
    if ( is_single() ) {

        $ajax_nonce = wp_create_nonce( "randomnonce" );

        ?>
        <script>
            ( function( $ ) {
                var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>",
                    submit_youtube = $('#submitYouTubeForm');

                // Star rating button
                $(submit_youtube).on('submit', function(event) {
                    event.preventDefault();

                    var submit_youtube_url = $('#submitYouTubeURL').val(),
                    submit_youtube_terms = $('#youtube_terms').is(':checked');

                    // Data to be sent to function
                        var data = {
                            'action': 'submit_youtube_callback',
                            'security': '<?php echo $ajax_nonce; ?>',
                            'post_id': <?php echo get_the_ID(); ?>,

                            'yt_url': submit_youtube_url,
                            'terms': submit_youtube_terms
                        };

                        // Send Data
                        jQuery.post(ajaxurl, data, function(response) {
                            submit_youtube.replaceWith(response);
                        });                     
                });
            } )( jQuery );
        </script> 
        <?php
    }
} add_action( 'wp_footer', 'submit_youtube_javascript', 100 );
1
Swen

wp_send_json_error( 'Error: Invalid data!' )

JSON文字列をエコーし​​ます:_{"success":false,"data":"Error: Invalid data!"}_

wp_send_json_error()のいいところは、パラメータが_WP_Error_オブジェクトになることです。

このJSON文字列をエコーする wp_send_json_success( 'Everything okay.' ) とは対照的に:_{"success":true,"data":"Everything okay."}_

どちらも内部的に wp_send_json() を使用してJSONデータを適切にエコーし、その後die()を使用します。

ただし、エラーがある場合は何も返されません。

実は、今は信じられません。しかし、JSコードを調べると、JSON応答を適切に処理できません。実際にすべてが正常に機能すると、$('#submitYouTubeForm')を置き換えるHTMLを返します。しかし、JSON応答では、HTMLではなくJSON応答があります。

実際にJSON文字列を取得できない場合は、console.log( response )を使用して確認してください。すべての応答にJSONを使用するか、wp_send_json_error()を使用する代わりに、プレーンHTMLエラーメッセージとdie()を自分で返すことを検討してください。

3
websupporter