web-dev-qa-db-fra.com

Comment utiliser wp_send_json_error?

J'ai du mal à comprendre comment wp_send_json_error fonctionne pour renvoyer des messages d'erreur. Cela fonctionne bien tant qu'aucune des conditions d'erreur n'est remplie. Mais s'il y a une erreur, rien n'est retourné.

Comment renvoyer les messages d'erreur définis dans wp_send_json_error() en cas d'erreur?

Voir mon code:

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' );

Et 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!' )

Va faire écho à une chaîne JSON: {"success":false,"data":"Error: Invalid data!"}

La bonne chose à propos de wp_send_json_error() est que le paramètre pourrait également être un objet WP_Error.

Par opposition à wp_send_json_success( 'Everything okay.' ) qui fait écho à cette chaîne JSON: {"success":true,"data":"Everything okay."}

Les deux s'appuient en interne sur wp_send_json() pour faire écho aux données JSON correctement et die() par la suite.

Mais s'il y a une erreur, rien n'est retourné.

En fait, je ne peux pas y croire en ce moment. Mais quand je regarde dans votre code JS, vous ne gérez pas correctement la réponse JSON. En fait, si tout fonctionne bien, vous retournez du HTML, qui remplace $('#submitYouTubeForm'). Mais avec la réponse JSON, vous n'avez pas de code HTML mais une réponse JSON.

Utilisez console.log( response ) pour voir si vous n'obtenez vraiment pas la chaîne JSON. Vous devriez penser à utiliser JSON pour toutes vos réponses ou au lieu d'utiliser wp_send_json_error() renvoyez simplement un message d'erreur HTML simple et die() par vous-même.

3
websupporter