我正在尝试实施Ajax请求,以便在点击时加载更多帖子。
但是我遇到了错误:Call to undefined function query_posts()
这是我的Ajax脚本:
$('#next-container').click(function() {
var IDs = [];
$(".element").each(function(){ IDs.push(this.id); });
$('#next-container').html('loading');
$.ajax({
url: 'wp-content/themes/freakyshape/inc/data.php',
type: 'POST',
data: {'post_ids[]': IDs },
success: function(data) {
$container.isotope( 'insert', $(data));
}
});
});
我的data.php文件加载帖子:
<?php
if (isset($_POST['post_ids'])) {
$ids = array();
$ids[] = $_POST['post_ids'];
$posts_per_page = 8;
global $wp_query;
query_posts(array('post_type' => array('post', 'portfolio'), 'post__not_in' => $ids, 'posts_per_page' => $posts_per_page));
while (have_posts()) : the_post();
?>
// I do some stuff echo;
<?php
endwhile;
wp_reset_query();
}
?>
和我的functions.php:
$admin_path = TEMPLATEPATH . "/inc/";
require_once ($admin_path . "data.php");
我需要做些什么才能让它发挥作用?
修改
我尝试用正确的方法做到这一点但没有任何作用......我想念一些事情......当你不懂英语时,正确理解博客指导并不容易......
function.php:
add_action('wp_ajax_load_post', 'load_post_callback');
add_action('wp_ajax_nopriv_load_post', 'load_post_callback');
wp_enqueue_script('script', get_template_directory_uri().'/js/load_post.js', array('jquery'), '1.0', 1 );
wp_localize_script('script', 'ajax_var', array('url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('ajax-nonce')));
load_post.php:
<?php
function load_post_callback() {
if (isset($_POST['post_ids'])) {
$nonce = $_POST['nonce'];
if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) ) {
die ( 'Interdit !');
}
$ids = array();
$ids[] = $_POST['post_ids'];
$posts_per_page = 8;
global $wp_query;
query_posts(array('post_type' => array('post', 'portfolio'), 'post__not_in' => $ids, 'posts_per_page' => $posts_per_page));
while (have_posts()) : the_post();
$post_type = get_post_type( $post->ID );
if ($post_type == 'post') {
$post_type = 'blog';
}
?>
<div class="element normal <?php echo $post_type; ?>" id="<?php echo the_id(); ?>">
<div class="element-container">
<img src="<?php echo wp_get_attachment_url( get_post_thumbnail_id()); ?>" class="thumbnail" />
<div class="element-back"></div>
<div class="element-description"><?php echo the_title(); ?></div>
<div class="element-category"><i class="icon"></i>   <?php echo $post_type; ?></div>
<a class="link" href="" title="<?php echo the_title(); ?>" onclick="gestionClic(compteur'id');">
<div class="more">more.</div>
</a>
</div>
</div>
<?php
endwhile;
wp_reset_query();
}
}
?>
load_post.js:
jQuery(document).ready(function() {
var url = ajax_var.url;
var nonce = ajax_var.nonce;
jQuery('#next-container').click(function() {
var IDs = [];
$(".element").each(function(){ IDs.push(this.id); });
console.log(IDs);
$('#next-container').html('loading');
$.ajax({
url: 'wp-content/themes/freakyshape/inc/load_post.php',
type: 'POST',
data: {'post_ids[]': IDs },//'post_ids='+IDs,
success: function($data) {
$container.isotope( 'insert', $data);
}
})
})
})
答案 0 :(得分:1)
使用Ajax这种方式不正确。要使代码正常工作,您需要包含wp-load.php
并使用其他一些解决方法。网上充满了这个可怕的例子。
核心撰稿人奥托解释了我们Don’t include wp-load, please.的主要原因。这些是:
为什么这是错误的
- 你没有wp-load.php实际上的第一个线索。插件目录和wp-content目录都可以移动 在安装中。可以移动所有WordPress文件 这样,你打算四处搜寻吗?
- 您立即将该服务器上的负载加倍。 WordPress和它的PHP处理现在必须每次加载两次 页面加载。一旦生成页面,然后再生产你的 生成的javascript。
- 您正在动态生成javascript。这只是缓存和速度的废话等。
醇>
正确的方法是:
wp_ajax_
挂钩运行PHP代码并将其返回给JS文件。wp_localize_script
将PHP变量传递给JS文件。One working example of mine。还有很多good examples from one of our mods和Ajax代码的主要贡献者。