web-dev-qa-db-fra.com

wp_localize_script n'est pas défini lorsqu'il est appelé via jquery ajax

J'ai du mal à obtenir ma demande ajax de travailler. Il échoue lorsque je déclenche mon $ajax et que je reçois cette erreur ...

Uncaught ReferenceError: feature_ajax n'est pas défini

C'est mon functions.php

// load our frontend modifiers
require_once(__DIR__ . '/lib/Frontend.lib.php');

Ceci est ma classe Frontend.lib.php php ...

class Frontend
{

    /** frontend constructor */
    public function __construct()
    {

        // enqueue our scripts
        add_action('wp_enqueue_scripts', array($this, 'action_wp_enqueue_scripts'));

        // add out ajax actions
        $this->ajax_actions();

    }

    /** frontend enqueued scripts */
    public function action_wp_enqueue_scripts()
    {

        // localize admin ajax
        wp_localize_script('ajax-actions', 'ajax_actions', array(
            'ajaxurl' => admin_url( 'admin-ajax.php' )
        ));

        // enqueue scripts
        wp_enqueue_script('ajax-actions');

    }


    /** ajax actions */
    public function ajax_actions()
    {

        // admin field postdata ajax actions
        add_action('wp_ajax_field_postdata', [__CLASS__, 'field_postdata']);

        // public field postdata ajax actions
        add_action('wp_ajax_nopriv_field_postdata', [__CLASS__, 'field_postdata']);

    }

    // Field Post Data
    public static function field_postdata()
    {
        global $post;
        $post_id = ($_REQUEST['id']);

        if($post_id){
            $post = get_post($post_id);
            setup_postdata($post);
            get_template_part('ajax/modal','field');
            die();
        }

    }

}

new Frontend();

Lorsque je déclenche le script $ajax ci-dessous, c'est lorsque j'obtiens l'erreur feature_ajax n'est pas défini .

Mais cela est défini dans le code ci-dessus.

Ce script ci-dessous est mon fichier theme-min.js

// load feature post data
$.ajax({
    cache: false,
    timeout: 8000,
    url: ajax_actions.ajaxurl,
    type: 'POST',
    data: {
        action: 'field_postdata',
        id: post_id
    },
    success: function (data) {
        alert(data);
    }
});

Toute aide pour comprendre ce que je fais mal serait géniale.

Merci


Code fixe mis à jour

Donc, ce que j'ai changé pour que cela fonctionne. J'avais déjà mis mon fichier main-min.js en file d'attente; j'ai donc combiné mon wp_localize_script en utilisant le même descripteur que mon javascript en file d'attente et tout a fonctionné.

// register js in footer
$filename = get_template_directory_uri() . '/assets/scripts/main-min.js';
wp_register_script('main-js', $filename, array(), Rand(), true);

// localize theme-js ajax actions
wp_localize_script('main-js', 'ajax_actions', array(
    'ajaxurl' => admin_url( 'admin-ajax.php' )
));

// enqueue required scripts
wp_enqueue_script('main-js')
3
joshmoto

Pour réussir à ajouter une variable à l'objet window via wp_localize_script, vous devez appeler correctement trois fonctions dans l'ordre suivant:

  1. wp_register_script

  2. wp_localize_script

  3. wp_enqueue_script

Dans votre cas, il vous manque le wp_register_script. Si quelqu'un rencontre le même problème, suivez les procédures du code ci-dessous.

PHP

<?php
    function my_theme_wp_enqueue_scripts() {
        $handle = 'my_handle';

        // Register the script
        wp_register_script($handle, '/path/to/my_script.js');

        // Localize the script with a new data
        wp_localize_script($handle, 'object_name', [
            'ajax_url' => admin_url('admin-ajax.php')
        ]);

        // Enqueue the script
        wp_enqueeu_script($handle);
    }
    add_action('wp_enqueue_scripts', 'my_theme_wp_enqueue_scripts');

Ensuite, vous pouvez accéder à l'objet localisé dans Javascript

var ajax_url = object_name.ajax_url;
console.log(ajax_url);

Modifiez le contenu de la variable $handle ainsi que le object_name dansPHPqui a du sens pour votre application.

3
Den Isahac