Unctions.php中的多个AJAX处理程序函数冲突

时间:2021-07-16 作者:Mathieu Préaud

我有两个不同的AJAX 在我的网站中加载更多功能。一个用于我的归档页面,第二个用于分类页面。

问题是,当两者都AJAX 处理程序函数位于“我的函数”中。php。当只有一个处理程序函数时,后者可以正常工作。

两种AJAX操作的JS代码:

/*
 * AJAX Load More for archive page
 */
 $(\'.load-more-archive\').click(function(){
  var button = $(this),
    data = {
    \'action\': handler,
    \'query\': posts_myajax,
    \'page\' : current_page_myajax
  };

  $.ajax({
    url : \'../wp-admin/admin-ajax.php\', // AJAX handler
    data : data,
    type : \'POST\',
    beforeSend : function ( xhr ) {
      button.hide();
    },
    success : function( data ){
      if( data ) {
        $(\'.wrapper-archive\').append(data);

        button.show();

        current_page_myajax++;

        if ( current_page_myajax == max_page_myajax )
          button.remove();
      } else {
        //button.remove();
      }
    }
  });
});

/*
 * AJAX Load More for taxonomy page
 */
 $(\'.load-more-tax\').click(function(){
  var button = $(this),
    data = {
    \'action\': handler,
    \'tax_post_type\': current_post_type,
    \'tax_term\': tax_term_id,
    \'query\': posts_myajax,
    \'page\' : current_page_myajax,
  };

  $.ajax({
    url : \'../wp-admin/admin-ajax.php\',
    data : data,
    type : \'POST\',
    beforeSend : function ( xhr ) {
      button.hide();
    },
    success : function( data ){
      if( data ) {
        $(\'.wrapper-taxonomy\').append(data);

        button.show();

        current_page_myajax++;

        if ( current_page_myajax == max_page_myajax )
          button.remove();
      } else {
        //button.remove();
      }
    }
  });
});
下面是两个AJAX处理程序的PHP代码:

/**
 * AJAX handler for archive page
 */
function archive_loadmore_ajax_handler(){

    $args = json_decode( stripslashes( $_POST[\'query\'] ), true );
    $args[\'paged\'] = $_POST[\'page\'] + 1;
    $args[\'post_type\'] = $_POST[\'action\'];
    $args[\'posts_per_page\'] = 4;

    $the_query = new WP_Query( $args );

    if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();

        get_template_part( \'template-parts/content\', \'cpt-archive\' );

    endwhile;

    endif;
    die;
}
add_action(\'wp_ajax_\'. $_POST[\'action\'] .\'\', \'archive_loadmore_ajax_handler\');
add_action(\'wp_ajax_nopriv_\'. $_POST[\'action\'] .\'\', \'archive_loadmore_ajax_handler\');



/**
 * AJAX handler for taxonomy page
 */
function taxonomy_loadmore_ajax_handler(){

    $args = json_decode( stripslashes( $_POST[\'query\'] ), true );
    $args[\'paged\'] = $_POST[\'page\'] + 1;
    $args[\'post_type\'] = $_POST[\'tax_post_type\'];
    $args[\'posts_per_page\'] = 4;
    $args[\'tax_query\'] = array(
        array (
            \'taxonomy\' => $_POST[\'action\'],
            \'field\' => \'id\',
            \'terms\' => $_POST[\'tax_term\']
        )
    );

    $the_query = new WP_Query( $args );

    if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();

        get_template_part( \'template-parts/content\', \'cpt-archive\' );

    endwhile;

    endif;
    die;
}
add_action(\'wp_ajax_\'. $_POST[\'action\'] .\'\', \'taxonomy_loadmore_ajax_handler\');
add_action(\'wp_ajax_nopriv_\'. $_POST[\'action\'] .\'\', \'taxonomy_loadmore_ajax_handler\');
我知道在致电AJAX 脚本,但我找不到解决它的方法。任何帮助都将不胜感激。非常感谢。

EDIT

我按照以下建议更新了PHP AJAX和JS AJAX:

JS

$(\'.load-more-archive\').click(function(){
 var button = $(this),
   data = {
   \'action\': \'load_archive\',
   \'my_post_type\': current_post_type,
   \'query\': posts_myajax,
   \'page\' : current_page_myajax
 };

 $.ajax({
   url : \'http://localhost:8888/sites/mysite/wp-admin/admin-ajax.php\',
   data : data,
   type : \'POST\',
   beforeSend : function ( xhr ) {
     button.hide();
   },
   success : function( data ){
     if( data ) {
       $(\'.wrapper-archive\').append(data);

       isLoaded();

       button.show(); // Insert new posts

       current_page_myajax++;

       if ( current_page_myajax == max_page_myajax )
         button.remove();
     } else {
       //button.remove();
     }
   }
 });
});
PHP

function mysite_archive_loadmore_ajax_handler(){

    $args = json_decode( stripslashes( $_POST[\'query\'] ), true );
    $args[\'paged\'] = $_POST[\'page\'] + 1;
    $args[\'post_type\'] = $_POST[\'my_post_type\']; 
    $args[\'posts_per_page\'] = 4;

    $the_query = new WP_Query( $args );

    if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();

        get_template_part( \'template-parts/content\', \'cpt-archive\' );

    endwhile;

    endif;
    die;
}
add_action(\'wp_ajax_load_archive\', \'mysite_archive_loadmore_ajax_handler\'); 
add_action(\'wp_ajax_nopriv_load_archive\', \'mysite_archive_loadmore_ajax_handler\'); 

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

使用$_POST[\'action\']WP_Query 作为一个动态动作名称是危险的,在代码中,它会触发所有AJAX请求的处理程序,即使是那些您不想要的请求。这是不可避免的,也是无法修复的死胡同。备选方案是强制性的。

相反,请使用静态非动态操作名称,例如。mathieu_loadmode_post_archivemathieu_loadmode_taxonomy_archive, 然后在javascripts AJAX中以与传递相同的方式传递post类型或分类名称tax_termtax_post_type.

其他注意事项:

不要使用相对路径admin-ajax.php, 这些示例使用本地化数据或绝对路径是有原因的,如果URL结构需要超过on,则代码将失败.. 使用相对路径将这些选项列入白名单,只允许有限的值子集,现在我可以从您的站点请求任何我想要的数据,或者请求一些非常缓慢和昂贵的数据。用户数据不可信,请不要在未经检查的情况下将其传递到API/类中。E、 g.如何阻止我添加meta_value 参数,或__not_in 参数。或者由作者请求所有帖子,以获取不可访问的内部帖子类型

相关推荐

index.php in URL

试图删除/指数菲律宾比索;从URL,这个htaccess文件位置为./var/www/html/.htaccess 以及内容<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) /index.php/$1 [L] </