1

我正在尝试实现一个 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");

我需要什么才能让它工作?

编辑:

我尝试用正确的方法来做,但没有这样的工作......我错过了一些东西......当你的英语不流利时,正确理解博客说明并不容易......

函数.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);

                }
            })
    })
})
4

1 回答 1

1

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

核心贡献者 Otto 解释了我们不包含 wp-load的主要原因。. 这些是:

为什么这是错误的

  1. 您没有第一个线索 wp-load.php 实际上在哪里。插件目录和 wp-content 目录都可以在安装过程中移动。所有的 WordPress 文件都可以用这种方式移动,你要四处寻找它们吗?
  2. 您立即使该服务器上的负载增加了一倍。WordPress 和它的 PHP 处理现在必须为每个页面加载加载两次。一次生成页面,然后再次生成生成的 javascript。
  3. 您正在动态生成 javascript。这对于缓存和速度等来说简直是垃圾。

正确的方法是:

  • 使用wp_ajax_钩子运行 PHP 代码并将其返回到 JS 文件。
  • 用于wp_localize_script将 PHP 变量传递给 JS 文件。

我在 WordPress Answers 上的一个工作示例。以及来自我们的一个模组和Ajax标签的主要贡献者的许多很好的例子。

于 2013-07-08T15:48:57.747 回答