AJAX在侧边栏中循环以加载帖子标题/类别

时间:2013-04-01 作者:andy

我有一个显示20篇最新帖子的侧边栏,我真正想做的是将该循环轴化,因此底部有一个加载更多的按钮。

问题是,这是一个相当复杂的循环,让WordPress与Ajax一起正常工作并不是儿戏。我对jQuery相当熟悉,但对于复杂的服务器端内容,我不是专家。

我已经读了几天关于Ajax和WordPress的书,但我无法让任何东西正常工作,或者根本无法正常工作。

我试过这个:How can I fetch loop of post titles via AJAX? 但它不起作用,给了我一个服务器错误。

这是我的小圈套
即使我只知道如何输出帖子标题,而忽略了Ajax请求中的所有其他内容,我相信我可以从那里开始破解它<我根本没法让它工作。

<ul>
<?php
    $sidebar_query = new WP_Query(array(
        \'showposts\' => 20
    ) );
?>

<?php while ($sidebar_query->have_posts()) : $sidebar_query->the_post(); ?>

    <li>
    <?php if(has_post_thumbnail()) :?>
        <div class="figure">
            <?php the_post_thumbnail(\'sidethumb\'); ?>
        </div> <!-- end div figure //centers thumbnail -->
    <?php else :?>
    <?php endif;?>
        <a href="<?php the_permalink() ?>">
            <span class="theparentcat">
    <?php
        $cat_names = wp_list_pluck( get_the_category(), \'cat_name\');
        echo wp_sprintf_l( \'%l\', $cat_names );
    ?>
        </span>
        <h2><?php the_title (); ?></h2>
        <span class="thetime">
            <?php echo human_time_diff( get_the_time(\'U\'), current_time(\'timestamp\') ) . \' ago\'; ?>
        </span>
        </a>
    </li>

<?php endwhile; wp_reset_query(); ?>
</ul>

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

你在这里发布的脚本是什么?我希望是这样not ajax请求将调用的脚本,不是吗??

通常,ajax请求的php脚本如下所示:

<?php
$output = array();

$posts = new WP_Query( array( \'showposts\' => 20 ) );

foreach ( $posts as $post ) {
  array_push( $output, $post->title );
}

header( \'Content-type: application/json\' );
die( json_encode( $output ) );
在JavaScript中,您可以检索json编码的数据,对其进行解码并用JavaScript打印出来。如果需要访问WordPress函数,可以使用输出缓冲。

<?php
$output = array();

$posts = new WP_Query( array( \'showposts\' => 20 ) );

foreach ( $posts as $post ) {
  array_push( $output, $post->title );
}

header( \'Content-type: application/json\' );
die( json_encode( $output ) );
现在,您可以访问JS中的数据:

$.post(
  adminurl,
  data,
  function( response ) {
    $(\'#outputdiv\').apend(\'<ul id="outputlist"></ul>\');
    for( var elem in response ) {
      $(\'#outputlist\').append(\'<li>\' + response[elem] + \'</li>\');
    }
  }
);
如果您需要一些WordPress函数,也可以使用outputbuffering:

<?php
$output = \'\';

$posts = new WP_Query( array( \'showposts\' => 20 ) );

ob_start();

echo \'<ul>\';
foreach ( $posts as $post ) {
  printf( \'<li><a href="%s">%s</a></li>\', get_permalink( $post->ID ), $post->title );
}
echo \'</ul>\';

$output = ob_get_clean();

header( \'Content-type: application/json\' );
die( json_encode( array( \'output\' => $output ) ) );
并打印出全部数据:

$.post(
  adminurl,
  data,
  function( response ) {
    $(\'#outputdiv\').apend(response.output);
  }
);
但是,减少ajax请求传输的数据量始终是一个非常好的主意。因此,最好只返回纯post数据,而不是html。

您的脚本可能如下所示(未测试!)

PHP:

<?php
$posts = new WP_Query( array( \'showposts\' => 20 ) );

$data = array();

foreach ( $posts as $post ) {

    $element = array(
        \'thumbnail\' => \'\',
        \'permalink\' => \'\',
        \'catlist\'   => \'\',
        \'title\'     => \'\',
        \'time\'      => \'\',
    );

    if ( has_post_thumbnail( $post->ID ) )
        $element[\'thumbnail\'] = get_the_post_thumbnail( $post->ID, \'sidethumb\' );

    ob_start();
    echo wp_sprintf_l(
        \'%l\',
        wp_list_pluck( get_the_category( $post->ID ), \'cat_name\')
    );
    $element[\'catlist\'] = ob_get_clean();

    ob_start();
    echo human_time_diff( get_the_time(\'U\'), current_time(\'timestamp\') ) . \' ago\';
    $element[\'time\'] = ob_get_clean();

    $element[\'permalink\'] = esc_attr( get_permalink( $post->ID ) );
    $element[\'title\']     = esc_html( $post->title );

    array_push( $data, $element );

}

wp_reset_query();

header( \'Content-type: application/json\' );
die( json_encode( $data ) );
JS公司:

var data = {};

$.post(
    adminurl,
    data,
    function( response ) { printSidebarPosts(response); }
);

function printSidebarPosts( response ) {

    var content = \'\';

    for ( var i in response ) {
        var out = response[i];

        var thumbdiv = ( out.thumbnail != \'\' ) ? \'<div class="figure">%thumbnail%</div>\' : \'\';

        var elem     = 
        \'<li>%thumbdiv%\'+
        \'<a href="%permalink%">\'+
        \'<span class="theparentcat">%catlist%</span>\'+
        \'<h2>%title%</h2>\'+
        \'<span class="thetime">%time%</span>\'+
        \'</a></li>\'
        .replace( /%thumbdiv%/g, thumbdiv )
        .replace( /%permalink%/g, out.permalink )
        .replace( /%catlist%/g, out.catlist )
        .replace( /%title%/g, out.title )
        .replace( /%time%/g, out.time );

        content = content + elem;
    }

    var sidebarcontent = \'<ul>%content%</ul>\'.replace( /%content%/g, content );

    $(\'#sidebar\').html( sidebarcontent );

}
在PHP部分,您应该只收集数据。在JavaScript部分,创建HTML。这大大减少了传输的数据量,加快了ajax请求的速度。

UPDATE

添加注释中要求的低级基础知识。

但是我如何放置一个可以点击的按钮。。。

<input type="button" id="get_more_posts_ajax_trigger" value="Show more posts" />
<a href="#" id="get_more_posts_ajax_trigger">Show more posts</a>
<div id="get_more_posts_ajax_trigger">Show more posts</div>
有三种可能的元素可以显示您可以单击的内容。在JavaScript中,您必须捕获此单击。

jQuery(document).ready(
  function($){
    $(\'#get_more_posts_ajax_trigger\').click(
      function(){
        var data = {
          \'action\' : [the ajax hook you registered in WordPress with add_action( \'wp_ajax_[action]\', ... ) and add_action( \'wp_ajax_nopriv_[action]\', ...)]
        };

        $.post( adminurl, data, function(response) { [see codeexamples above] } );
      };
    );
);
顺便说一下,php在我的页面上完全搞砸了may的布局

你把PHP代码放进了你的页面?好啊你必须把它变成一个函数。您必须在WordPress中将此函数注册为ajax回调。使用add_action( \'wp_ajax_[action]\', \'YourFunctionNameHere\' );add_action( \'wp_ajax_nopriv_[action]\', \'YourFunctionNameHere\' );

你必须阅读this Codex page 关于ajax和此Codex page about how to implement ajax 插件中。尤其是零件Ajax on the Viewer-Facing Side.

结束

相关推荐

Noob Loop Question

我带来了一个基本问题,但我无法解决,我想这对你来说很容易。我想,如果我有2个或更多的帖子循环,显示整个循环。我尝试了以下方法:<?php $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1; $portfolio = new WP_Query(array(\'post_type\' => \'project\', \'posts_per_page\' => 12, \'paged\' =&g