未定义对query_posts的Ajax请求

时间:2013-07-08 14:22:34

标签: php ajax wordpress loops

我正在尝试实施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>&nbsp;&nbsp <?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);

                }
            })
    })
})

1 个答案:

答案 0 :(得分:1)

使用Ajax这种方式不正确。要使代码正常工作,您需要包含wp-load.php并使用其他一些解决方法。网上充满了这个可怕的例子。

核心撰稿人奥托解释了我们Don’t include wp-load, please.的主要原因。这些是:

  

为什么这是错误的

     
      
  1. 你没有wp-load.php实际上的第一个线索。插件目录和wp-content目录都可以移动   在安装中。可以移动所有WordPress文件   这样,你打算四处搜寻吗?
  2.   
  3. 您立即将该服务器上的负载加倍。 WordPress和它的PHP处理现在必须每次加载两次   页面加载。一旦生成页面,然后再生产你的   生成的javascript。
  4.   
  5. 您正在动态生成javascript。这只是缓存和速度的废话等。
  6.   

正确的方法是:

在WordPress答案中

One working example of mine。还有很多good examples from one of our modsAjax代码的主要贡献者。