Pergunta sobre como desenvolver com WordPress a partir do WordPress: Chamada de função $.ajax 400 Bad Missing

Um usuário perguntou ?

Toda a tarde,

Eu li o seguinte problema em fóruns e outros lugares online, mas nada até agora parece resolver o problema em andamento.

Atualmente estou criando um plugin personalizado para expandir o repositório de imagens do plugin que não é mais mantido para um cliente. Eu queria usar o ajax para projetar uma função projetada dinamicamente para criar, atualizar e excluir termos personalizados, adicionar um metatermo e postar no atalho necessário sem que meu cliente precisasse copiar e alterar o painel de administração.

Se eu usar a API para fazer essa tarefa, também demora um pouco para processar o servidor e não funciona 100% das vezes.

Mensagem de erro:
POST 400 (Bad Request)

Iniciar plug-in:


require '_inc/ims_ca_functions.php';

add_action('admin_enqueue_scripts', 'admin_scripts');

function admin_scripts(){

    wp_enqueue_script( 
        'ims_ca_core', 
        plugin_dir_url( __FILE__ ) . '_assets/ims_ca_core.js', 
        array(), 
        '1.0.0', 
        false
    );
    wp_localize_script( 
        'ims_ca_core', 
        'ims_ca_rest', 
        array(
            'rest_url' => get_site_url().'/wp-json',
            'nonce' => wp_create_nonce( 'wp_rest' ),
            'ajaxurl' => admin_url('admin-ajax.php')
    ) );  
}

add_action('wp_ajax_ims_ca_test-ajax', 'imsCAAjaxRequest');
add_action('wp_ajax_nopriv_ims_ca_add_to_term', 'imsCAAjaxRequest');

Função de chamada:


function imsCAAjaxRequest(){

    // Ajax Method Request
    $mode           = $_POST['mode']; //POST, UPDATE, DELETE, GET

    // IMS_ALBUM Detail Request
    $taxID          = 'ims_album';
    $termID         = $_POST['term_ID'];
    $termTitle      = $_POST['term_Title'];
    $termSlug       = Optimiser::uglify($termTitle);

    // Post Detail Request
    $catID          = 59;
    $postID         = $_POST['post_ID'];
    $postTitle      = $termTitle;
    $postSlug       = $termSlug;
    $postContent="[image-store album=".$termID.' all=true]';
    $postStatus="Publish";
    $postType="post";
    
    switch ($mode){
        case 'POST':

            //First Insert New Term
            wp_insert_term( 
                $termTitle,
                $taxID,
                array(
                    'description'   => '',
                    'slug'          => $termSlug,
                    'parent'        => 0     
                )
            );

            //Second Insert New Post
            $postARGS = array(
                'post_title'        => $postTitle,
                'post_type'         => $postType,
                'post_status'       => $postStatus,
                'comment_status'    => 'closed',
                'post_category'     => $catID,
                'post_content'      => $postContent
            );
            wp_insert_post( $postARGS );

            //Third Insert Term Meta
            $newTerm = get_term_by( 
                'slug',
                $termSlug,
                $taxID
            );

            $newPostSlug = get_post_field( 'post_name', get_post() );

            if ($newPostSlug == $newTerm):
                $newPID = $newPostSlug->id;
            endif;

            add_term_meta(
                $newTerm->term_id,
                'ims_ca_term-pid',
                $newPID,
                true
            );

            // Finally Create and Encode JSON Array
            $response = [
                'Message'   => 'Successfully added new album: '.$termTitle,
                'Album ID'  => $newTerm->term_id,
                'Post ID'   => $newPID
            ];

            wp_reset_postdata();

            return json_encode($response);

            break;
            
        case 'UPDATE':

            //First Update Term
            wp_update_term( 
                $termID,
                $taxID,
                array(
                    'name'          => $termName,
                    'slug'          => $termSlug   
                )
            );

            //First Update Post
            $postARGS = array(
                'ID'            => $postID,
                'post_title'    => $postTitle,
                'post_slug'     => $postSlug
            );

            wp_update_post( $postARGS );

            break;

    }
    wp_die();
}

O jQuery:


$(".testAJAX").on('click', function(e){
        jQuery.ajax({
            url : ims_ca_rest.ajaxurl,
            method: "POST",
            data:{
                action: 'imsCAAjaxRequest',
                mode: 'POST',
                term_Title: 'Test Term Alpha'
            },
            beforeSend: function ( xhr ) {
                xhr.setRequestHeader( 'X-WP-Nonce', ims_ca_rest.nonce );
            },
            success : function( response ) {
                console.log(response);
            }
        });
        e.preventDefault();
    })

Estou perdendo agora e agradeço qualquer ajuda.

Abraços, Estevão

Este tópico foi modificado 1 ano, 10 meses atrás por.

(@ alegremente)

1 ano, 10 meses atrás

Parece que você está misturando REST e AJAX. Para AJAX, o valor de sua atividade deve corresponder ao nome de sua atividade, não ao nome de sua função. Seu código add_action('wp_ajax_ims_ca_test-ajax', 'imsCAAjaxRequest')você usaria dados javascript com action : 'ims_ca_test-ajax'. Isso é para aplicativos administrativos.

Seu código add_action('wp_ajax_nopriv_ims_ca_add_to_term', 'imsCAAjaxRequest') usar action : 'ims_ca_add_to_term' e está disponível para usuários que não estão logados.

O nonce deve estar no mesmo local onde a ação está definida em javascript. É para REST ser colocado no cabeçalho da solicitação. E você precisa verificá-lo no código PHP e santificar todas as variáveis ​​$_POST que você está usando como está.

Você também deve verificar a capacidade, para não receber lixo aleatório de não usuários sendo adicionados ao banco de dados.

lançador de tópicos

(@sasherwood93)

1 ano, 10 meses atrás

Obrigado @ alegremente pela sua resposta.

Modifiquei minha ‘ação’, mas em vez do erro 400, agora estou recebendo o erro 500.

Stephen

(@ alegremente)

1 ano, 10 meses atrás

Certifique-se de ativar o modo de depuração e o registro de depuração. Você pode então visualizar o log de erros do servidor.

lançador de tópicos

(@sasherwood93)

1 ano, 10 meses atrás

Olá,

Eu passei pelo código e agora o aplicativo ajax funciona, mas agora isso provavelmente ajuda, a imagem retorna um erro 500 após postar uma nova galeria e restaura a url para posts.php.

Desativei meu plugin personalizado que restaura a postagem ao normal.

Alguma idéia se isso pode estar relacionado ao meu script e função Ajax.

Isto foi útil?

0 / 0

Deixe uma resposta 0

O seu endereço de email não será publicado. Campos obrigatórios são marcados *