使用AJAX调用帖子的正确方式

时间:2012-10-01 作者:Dan

我正在尝试用jQuery编写一个图像库插件。我使用的是jQuerys$。post AJAX方法,用于从相关post页面发送和接收信息。基本上,每次点击“下一步”按钮时,我都会循环浏览附件并添加一个新图像,直到我使用了所有图像(此时我需要返回一些东西来停止AJAX,但还不知道如何…)。

我读到了一些关于如何做到这一点的非常矛盾的信息。我非常想知道如何从另一个PHP文件访问WP数据和函数。有什么想法吗?我对这件事感到厌倦、压力大,而且通常都是疯了:)

2 个回复
SO网友:kaiser

正如@MatthewBoynes所言$.post() 请求每个图像可能会带来一些开销。

更好的解决方案可能是抓取并缓存它们,然后使用wp_localize_script().

$attachments = get_posts( array(
     \'post_parent\'    => get_the_ID()
    ,\'post_type\'      => \'attachment\'
    ,\'posts_per_page\' => -1
    #,\'exclude\'        => get_post_thumbnail_ID() // only needed if we want to exclude the feat. image
) );

// Hook those to `wp_enqueue_scripts`
wp_register_script( 
     \'gallery\'
    ,get_template_directory_uri().\'/js/gallery.js\'
    ,array( \'jquery\' )
    ,filemtime( get_template_directory().\'/js/gallery.js\' )
    ,true
);
wp_localize_script(
     \'gallery\'
    ,\'gallery_object\'
    ,json_encode( $attachments )
);
然后您可以访问gallery_object 从您的内部~/js/gallery.js 使用.on() 单击处理程序。

SO网友:Matthew Boynes

在这里使用ajax可能不符合您的最佳利益(只有一个例外,请参见下文)。首先,您将创建对服务器的不必要调用来查询每个图像。其次,结果将无法缓存,尤其是在您发出POST请求的情况下(这不是正确的HTTP方法/动词,因为您没有更改任何内容;在您的示例中,您希望使用GET请求[$.get() 在jQuery中,ajax speak],但我跑题了)。第三,它对用户来说会很慢。

最好是在初始页面调用中循环浏览帖子,并将图像URL输出到javascript数组,或者将帖子数组输出为JSON。您还可以循环并输出<img> 标签,但图像将预先加载,而不是根据请求加载(这是否好取决于站点和图像)。我会选择第一个选项,下面是我如何开始的:

<script type="text/javascript">
var my_images = [
<?php
# Here is where you\'ll loop through your attachments
?>
];
</script>
唯一的例外是,如果您有大量图像,例如每页>100张。在这种情况下,您必须找到适当的平衡,并对成批图像进行ajax调用,将您所问的与我上面所建议的结合起来。

祝你好运

编辑:

再想一想,我要做的是输出一个指向图像的链接列表,标题作为链接文本,然后使用JS读取,设置幻灯片,并按需动态加载图像(链接标签的href)。这与JS数组没有什么不同,只是数据存储在HTML中。因为它是HTML格式的,所以它具有一些明显的优势:禁用JS的浏览器仍然能够访问照片,您将拥有图像的标题,不处理JS的搜索引擎爬行器仍然会为图像编制索引,并且爬行器也会读取您希望的关键字丰富的图像标题。这是你如何设置的,部分是从the codex:

<ul>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post();
    $attachments = get_posts( array(
        \'post_type\' => \'attachment\',
        \'numberposts\' => -1,
        \'post_status\' => null,
        \'post_parent\' => $post->ID
    ) );
    if ( $attachments ) foreach ( $attachments as $attachment ) : ?>
    <li><a href="<?php echo wp_get_attachment_url( $attachment->ID ); ?>"><?php echo apply_filters( \'the_title\', $attachment->post_title ); ?></a></li>
    <?php endforeach; ?>
</ul>

结束