无法在自定义插件中访问当前帖子的ID

时间:2015-08-08 作者:AlexFADev

我有一个插件,它在upvote框前面加了一个the_content 通过AJAX将数据发送回主插件PHP文件,并在成功时调用函数更新数据库值。

以下是来自AJAX的PHP回调:

function update_parlay_points() {
    //Update Parlay Points field on database with points from Post request. 
    //global $post;
    //$post_id = $post->ID;     
    $post_id = get_the_ID();
    $points = $_POST[\'score\'];      
    $update_points = "UPDATE wp_posts 
        SET parlay_points = \'$points\' 
        WHERE id = $post_id";   
    var_dump( $post_id );
    echo $update_points;           
    global $mysqli;
    $mysqli->query( $update_points ) or die( "Query failed" );
    wp_die();
}
在Chrome的开发工具中,这给了我:

bool(false)UPDATE wp\\u posts SET parlay\\u points=“26”,其中id=查询失败

正如你所看到的,我试图声明$post 变量为全局变量,用于说明由于处于循环外部而导致的故障。触发AJAX请求的内容的前缀为the_content, 因此,我不确定是否需要以某种方式再次“进入”循环。我试过了if ( have_posts() )if ( is_single() ) 之前get_the_ID() 没有成功。总的来说,这个循环让我很困惑。

我还尝试访问$post->ID 从行动挂钩the_post. 奇怪的是,我能够成功地回显当前帖子的ID,但无法将其存储在全局范围的变量中。

$post_id = Null;
add_action( \'the_post\', \'wp_store_post_info\' );
function wp_store_post_info() {
    //Set current post as global variable. 
    global $post;
    global $post_id;
    $post_id = $post->ID;
    echo $post_id;
}
function update_parlay_points() {
    //...
    global $post_id;
    //Do stuff with the $post_id...
}
这也不起作用:

$GLOBALS[\'post_id\'] = $post->ID;
我确信正在调用上述函数,因为$post_id 正在得到回应。但是,当我单击向上投票按钮时,我得到:

NULL UPDATE wp\\u posts SET parlay\\u points=“28”,其中id=查询失败

3 个回复
SO网友:gmazzap

如您所见,我尝试将$post变量声明为全局变量,以解释由于超出循环而导致的失败。

问题是not post是“循环外的”,问题是AJAX请求是一个完全独立的HTTP请求。

当您执行AJAX请求时,就像您在浏览器上打开一个新窗口,并在这个单独的窗口中打开url一样。这意味着处理AJAX请求的脚本知道nothing 关于发送请求的页面。

如果需要处理AJAX请求中的特定帖子,则需要发送帖子ID作为AJAX请求数据的一部分进行处理。

SO网友:Abhik

我的建议是wp_localize_script() 将post id传递给AJAX调用<类似这样的。。

function my_script_enqueue() {
    global $post;

    $translations = array(
        \'postID\' => $post->ID
    );

    wp_enqueue_script( \'myscript\', \'/url/to/your/script.js\', array(\'jquery\') );
    wp_localize_script( \'myscript\', \'MyAJAX\', $translations );
}
add_action(\'wp_enqueue_scripts\', \'my_script_enqueue\')

SO网友:Lasse M. Tvedt

通过ajax发送单个帖子的帖子id怎么样?因此,如果创建一个包含id的隐藏输入,如下所示:

<input type="hidden" id="post_id" name="post_id" value="<?php echo $post->ID; ?>">
然后,您可以选择id并通过ajax请求发送它,因此您的函数最终将显示如下所示:

function update_parlay_points() {

    //Update Parlay Points field on database with points from Post request.     
    $post_id = $_POST[\'post_id\'];
    $points = $_POST[\'score\'];      

    $update_points = "UPDATE wp_posts 
        SET parlay_points = \'$points\' 
        WHERE id = $post_id";   

    var_dump( $post_id );

    echo $update_points;           

    global $mysqli;
    $mysqli->query( $update_points ) or die( "Query failed" );

    wp_die();
}   
我还想看看$wpdb Object, 而不是使用$mysqli来处理DB静音。

结束

相关推荐

query_posts with meta_value

我有类别\'news\' http://localhost/foldername/news, 对于每个\'news\' 我的自定义字段名为\'years\' 并设置为文本字段。我在不同的岗位上分配了2个值\'2013\' 和\'2014\'. 我首先要做的只是展示2014 在中发布\'news\' 类别http://localhost/foldername/news 第二个是传递url参数,所以如果我想显示\'2013\' 要使用以下内容http://localhost/foldername/news/?