如何在functions.php文件中加入多个Wordpress AJAX 脚本?

hrirmatl  于 2023-02-03  发布在  PHP
关注(0)|答案(1)|浏览(159)

我正在尝试将2个Wordpress AJAX 脚本加入到我的functions.php文件中,但是我似乎遇到了一个错误。第一个AJAX脚本工作正常,但是第二个我一直得到一个500内部服务器错误。
到目前为止,我在 AJAX 脚本中所拥有的是:
第一个块是我的第一个 AJAX 脚本,位于my-ajax-script.js

function lesson_watched_call(lesson_id_value) {  
    console.log('Lesson watched fn called.');
    console.log(lesson_id_value);
    $.post(my_ajax_obj.ajax_url, {
        _ajax_nonce: my_ajax_obj.nonce,  // nonce
        action: "lesson_watched", // action call
        lesson_value: lesson_id_value // data
    });
}

第二个块是我的第二 AJAX 脚本,位于fav-ajax-script.js

function toggleFavTut(tutorial_id_value) {  
    console.log('Tutorial toggle fn called.');
    console.log(tutorial_id_value);
    $.post(my_ajax_obj.ajax_url, {
        _ajax_nonce: my_ajax_obj.nonce,  // nonce
        action: "tutorial_fav_toggle", // action call
        tutorial_value: tutorial_id_value // data
    });
}

在我的functions.php文件中,我有:

/*---------------------------------------------------------------------------------*/
/*  Enqeue AJAX Script and Define Lesson Watched Function  */
/*---------------------------------------------------------------------------------*/
add_action( 'wp_enqueue_scripts', 'enqueue_ajax_scripts' );
function enqueue_ajax_scripts() {

  wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/my-ajax-script.js', array('jquery') );
  wp_localize_script( 'ajax-script', 'my_ajax_obj',
          array( 'ajax_url' => admin_url( 'admin-ajax.php' ),
                 'nonce'    => wp_create_nonce( 'lesson_nonce_value' ),
          ) 
        );

  wp_enqueue_script( 'ajax-script2', get_template_directory_uri() . '/js/fav-ajax-script.js', array('jquery') );
  wp_localize_script( 'ajax-script2', 'my_ajax_obj',
          array( 'ajax_url' => admin_url( 'admin-ajax.php' ),
                 'nonce'    => wp_create_nonce( 'tutorial_nonce_value' ),
          ) 
        );
}

function lesson_watched() {
    $lastValue_php = wp_unslash( $_POST['lesson_value'] );
    $current_user_id = get_current_user_id();

    $found = get_user_meta( $current_user_id, 'lessons_watched_ids', true );

    if ( !in_array( $lastValue_php, $found ) ) :
      if( empty( $found ) ) :  
        update_user_meta( $current_user_id, 'lessons_watched_ids', array( $lastValue_php ) );
      else :
        $found[] = $lastValue_php;
        update_user_meta( $current_user_id, 'lessons_watched_ids', $found );
      endif;
    endif;

    wp_die(); // Ends all AJAX handlers
}

add_action('wp_ajax_nopriv_lesson_watched', 'lesson_watched');
add_action('wp_ajax_lesson_watched', 'lesson_watched');

/*---------------------------------------------------------------------------------*/
/*  Enqeue AJAX Script and Define Tutorial Toggle Function  */
/*---------------------------------------------------------------------------------*/
function tutorial_fav_toggle() {
  $tutorial_value = wp_unslash( $_POST['tutorial_value'] );
  $current_user_id = get_current_user_id();

  $found = get_user_meta( $current_user_id, 'tutorial_favorited_ids', true );

  if ( !in_array( $tutorial_value, $found ) ) :
    $found[] = $tutorial_value;
    update_user_meta( $current_user_id, 'tutorial_favorited_ids', $found );
  else:
    $key = array_search( $tutorial_value, $found );
    unset( $found[$key] );
    update_user_meta( $current_user_id, 'tutorial_favorited_ids', $found );
  endif;

  wp_die(); // Ends all AJAX handlers
}

add_action('wp_ajax_nopriv_tutorial_fav_toggle', 'tutorial_fav_toggle');
add_action('wp_ajax_tutorial_fav_toggle', 'tutorial_fav_toggle');

我首先将两个脚本排队,然后对每个脚本进行本地化。我想知道是否可能必须对某些本地化变量使用不同的变量,但我不确定。您是否有调试的提示?

rta7y2nd

rta7y2nd1#

根据docswp_localize_script的第二个参数应该是唯一的。
$object_name是包含数据的变量的名称。注意这对于脚本和插件或主题都是唯一的。因此,这里的值应该正确地加上slug或其他唯一的值作为前缀,以防止冲突。
因此,按照您的模式,第二个函数可以使用my_ajax_obj2作为变量。

wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/my-ajax-script.js', array('jquery') );
  wp_localize_script( 'ajax-script', 'my_ajax_obj',
          array( 'ajax_url' => admin_url( 'admin-ajax.php' ),
                 'nonce'    => wp_create_nonce( 'lesson_nonce_value' ),
          ) 
        );

  wp_enqueue_script( 'ajax-script2', get_template_directory_uri() . '/js/fav-ajax-script.js', array('jquery') );
  wp_localize_script( 'ajax-script2', 'my_ajax_obj2',
          array( 'ajax_url' => admin_url( 'admin-ajax.php' ),
                 'nonce'    => wp_create_nonce( 'tutorial_nonce_value' ),
          ) 
        );

一定要注意让你的变量也特定于你的应用程序。这些变量实际上都只是全局window对象上的属性,任何东西都可以读/写它们,所以要确保它们是唯一的。

相关问题