Load categories with ajax

时间:2015-06-06 作者:user668499

我没有任何链接或演示,因为我在本地工作

我有不同类别的新闻帖子。

我想将类别显示为按钮。

当您单击一个类别时,我想使用ajax加载这些帖子,这样就不会重新加载页面。

类别按钮

    <ul>

      <?php

        $cat_args = array(
          \'orderby\'     => \'name\',
          \'order\'       => \'ASC\',
          \'hide_empty\'  => 1
        );


        $cats = get_categories($cat_args);

        foreach($cats as $cat){
          echo \'<li><a href="#" data-slug="\' . $cat->term_id . \'" class="js-category-button">\' . $cat->name . \'</a></li>\';
        }

        //echo \'<pre>\'; print_r($cats); echo \'</pre>\';

      ?>

     </ul>
jQuery

    $(\'.js-category-button\').on(\'click\', function(e){
      e.preventDefault();
      var catID = $atj(this).data(\'slug\');
      var ajaxurl = \'http://my-site.co.uk <?php bloginfo("wpurl");?>/wp-admin/admin-ajax.php\';
        $atj.ajax({
            type: \'POST\',
            url: ajaxurl,
            dataType: \'jsonp\',
            crossDomain : true,
            data: {"action": "load-filter", cat: catID },
            success: function(response) {
                $atj(".the-news").html(response);
                return false;
            }
        });
    })       
函数中的php查询。php

    add_action( \'wp_ajax_nopriv_load-filter\', \'prefix_load_cat_posts\' );
    add_action( \'wp_ajax_load-filter\', \'prefix_load_cat_posts\' );

    function prefix_load_cat_posts () {
      $cat_id = $_POST[ \'cat\' ];

      $args = array (
        \'cat\' => $cat_id,
        \'posts_per_page\' => 3,
        \'order\' => \'DESC\'
      );

      $posts = get_posts( $args );

      ob_start ();

      foreach ( $posts as $post ) {
        setup_postdata( $post ); ?>

        <div id="post-<?php echo $post->ID; ?> <?php post_class(); ?>">
          <h1 class="posttitle"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>

          <div id="post-content">
          <?php the_excerpt(); ?>
        </div>

        </div>

      <?php } wp_reset_postdata();

      $response = ob_get_contents();
      ob_end_clean();

      echo $response;

    }
当我单击类别时,控制台会显示502代理错误(找不到主机)

有人能看到我做错了什么,或者如何解决这个问题吗。

更新

我的代码现在部分正常工作,但仍有问题

我的js当前位于单独的js文件中

我能让它工作的唯一方法是使用ajaxurl的网站url

  $atj(\'.js-category-button\').on(\'click\', function(e){
    e.preventDefault();
    var catID = $atj(this).data(\'slug\');
    var ajaxurl = \'http://mysite.co.uk/wp-admin/admin-ajax.php\';
      $atj.ajax({
          type: \'POST\',
          url: ajaxurl,
          crossDomain : true,
          //dataType: \'jsonp\',
          //contentType: "text/html",
          dataType: \'html\',
          data: {"action": "load-filter", cat: catID },
          success: function(response) {
              $atj(".the-news").append(response);
              return false;
          }
      });
  })
我的php脚本在函数中。php

我认为函数中应该只有一个标记。所以我不想在函数中突破php来创建html标记。这就是为什么我试图将其全部添加到$response变量中,然后得到响应。

  add_action( \'wp_ajax_nopriv_load-filter\', \'prefix_load_cat_posts\' );
  add_action( \'wp_ajax_load-filter\', \'prefix_load_cat_posts\' );

  function prefix_load_cat_posts () {

    global $post;

    $cat_id = $_POST[ \'cat\' ];

    $args = array (
      \'cat\' => $cat_id,
      \'posts_per_page\' => 3,
      \'order\' => \'ASC\'
    );


    $cat_query = new WP_Query($args);

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


      $response = \'<div class="the-post">\';
      $response .= \'<h1 class="the-title">\';
      $response .= \'<a href="#">\'. the_title() .\'</a>\';
      $response .= \'</h1>\';
      $response .= \'<p>\'. the_content().\'</p>\';
      $response .= \'</div>\';


      echo $response;

      endwhile; 

      endif; 

      wp_reset_postdata(); 

      die(1); 
  }    
这类作品。我得到了带有帖子标题的html输出,但它在html之外,我无法输出内容。

  add_action( \'wp_ajax_nopriv_load-filter\', \'prefix_load_cat_posts\' );
  add_action( \'wp_ajax_load-filter\', \'prefix_load_cat_posts\' );

  function prefix_load_cat_posts () {

    global $post;

    $cat_id = $_POST[ \'cat\' ];

    $args = array (
      \'cat\' => $cat_id,
      \'posts_per_page\' => 3,
      \'order\' => \'ASC\'
    );


    $cat_query = new WP_Query($args);

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


      $response = \'<div class="the-post">\';
      $response .= \'<h1 class="the-title">\';
      $response .= \'<a href="#">\'. the_title() .\'</a>\';
      $response .= \'</h1>\';
      $response .= \'<p>\'. the_content().\'</p>\';
      $response .= \'</div>\';


      echo $response;

      endwhile; 

      endif; 

      wp_reset_postdata(); 

      die(1); 
  }    
如果您能帮助我们实现这一目标,我们将不胜感激。

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

错误说明了一切,您正在将请求发送到无效的主机。

更改此项:

 var ajaxurl = \'http://my-site.co.uk <?php bloginfo("wpurl");?>/wp-admin/admin-ajax.php\';
收件人:

 var ajaxurl = "<?php echo esc_js( admin_url( \'admin-ajax.php\' ) ) ?>";
Note: 根据您的代码和描述,我假设您是在PHP中生成jQuery代码,而不是在js文件中。

此外,在ajax响应发出后,您必须退出程序(这不是自动完成的,请求可能会永远打开,请参阅documentation):

echo $response;
// Terminate
exit;
我在您的代码中看到了更多错误:您告诉jQuery使用JSONP数据,但您的ajax响应是HTML字符串。应删除此行或将其更改为正确的数据类型:

dataType: \'jsonp\',
问题编辑完毕后,您引入了一个新问题。你是想假装the_content() 价值$response 但是the_content() 打印帖子内容,不返回任何值。如果要获取帖子内容的值,应改用get\\u the\\u content(),并获得与相同的结果the_content 你应该申请the_content 过滤器。更改此项:

$response .= \'<p>\'. the_content().\'</p>\';
收件人:

// <p> are not need because the the_content filters include wpautop()
$response .= apply_filters( \'the_content\', get_the_content() );

结束

相关推荐

在更改帖子的插件时,是否有AJAX调用的日志?

更改页面的slug时(单击OK),会发出ajax调用,检查slug是否可用,如果不可用,则生成不同的slug。是否有人知道是否有任何日志记录,或者是否有任何方法可以调查发生的情况?即使知道这个过程的来源在哪里也会很有帮助。我经历了一种非常奇怪的行为,即页面的段塞正在更改为不同帖子类型的帖子,但只有在段塞没有更改的情况下才会更改。这就好像我们已经确定这个弹头是它自己的复制品。不知道如何调查这种行为,任何朝着正确方向捅的人都会受到赞赏!