我正在为前端编写一个审批后实用程序,因为我们不希望编辑器能够访问管理仪表板。堆栈上的问题与我试图完成的几乎相同,但这家伙的问题与无限循环问题有关。否则,他声称他的代码有效:
How to change post status from publish to draft using hook in wordpress?
我正在编写一个插件来实现这一点(在我的例子中,我想将“草稿”更改为“发布”)。我不想编辑这些函数。php的子主题,因为我希望插件是独立的,对于任何WordPress站点。所以所有代码都在插件的主php文件中。我可以获得所有状态为“草稿”的帖子
- the;更改状态“;代码如下(在插件主php文件中):
/* This function should toggle a post status from \'draft\' to \'publish\' */
add_action( \'wp_ajax_approvepost\', \'approvepost_callback\' );
add_action( \'wp_ajax_nopriv_approvepost\', \'approvepost_callback\' );
function approvepost_callback(){
$post = array(
\'ID\' => $_POST[\'postid\'], // e.g., 28
\'post_status\' => \'publish\',
\'edit_date\' => true
);
$result = wp_update_post($post,true); // (there, you like that better?)
echo $result; // I get a result of "1". The post ID is 28. wp_update_post failed?
wp_die();
}
。。。wp_update_post
返回1,所以我认为这意味着没有错误。但当我刷新前端页面时,帖子再次显示,这意味着它仍处于草稿模式,当我在WP admin仪表板中检查帖子时,果然,它仍处于草稿模式。我做错了什么或错过了什么?UPDATE:如果我从我的子主题函数执行函数。php,代码可以工作,但不能使用AJAX。我必须直接调用该函数,如刷新页面,该函数返回帖子ID,帖子状态将更改为“发布”。只要我使用AJAX调用函数,post状态就不会改变,函数返回1。
UPDATE我完全删除了AJAX操作,并默认为旧时的标准表单提交,它刷新表单页面。在这些条件下,wp\\U update\\U post按预期工作。关于wp\\u update\\u post的一些内容不喜欢被AJAX调用。我怀疑它与安全性有关,但不管它是什么,我在文档中找不到任何参考。
ADDITIONAL JAVASCRIPT有些人要求查看javascript,尤其是ajax代码:
jQuery(document).ready(function($){
// AJAX url
var ajax_url = approve_posts_ajax_object.ajax_url;
var data = {
\'action\': \'approvepost\',
};
$(\'button#submit-approval\').on("click",function(){
var checkboxes = $("input[name=\'post_id\']");
data.postid = [];
// loop over them all
for (var i=0; i<checkboxes.length; i++) {
// And stick the checked ones onto an array...
if (checkboxes[i].checked) {
data.postid[i] = $(checkboxes[i]).val();
}
else{
data.postid[i] = "";
}
}
$.ajax({
url: ajax_url,
type: \'post\',
data: data,
dataType: \'json\',
success: function(response){
// Add new rows to table
approvePost(response);
}
});
});
});
function approvePost(data){
jQuery("#diag").html(data); //just want to output the callback response for now.
}
SOLUTION (so that others can see what works):
Javascript, with AJAX call:jQuery(document).ready(function($){
// AJAX url
var ajax_url = approve_posts_ajax_object.ajax_url;
var data = {
\'action\': \'approvepost\',
};
$(\'button#approval_submit\').on("click",function(){
var checkboxes = $("input[name=\'post_id\']");
data.postid = [];
// loop over them all
for (var i=0; i<checkboxes.length; i++) {
// And stick the checked ones onto an array...
if (checkboxes[i].checked) {
data.postid[i] = $(checkboxes[i]).val();
}
}
$.ajax({
url: ajax_url,
type: \'post\',
data: data,
dataType: \'json\',
success: function(response){
approvePost(response);
}
});
});
});
function approvePost(data){
jQuery("#diag").html("");
var string = "\\n";
jQuery.each(data,function(k,v){
string += k + " = " + v + "<br>";
});
jQuery("#diag").append(string);
}
PHP (with ajax callback function, in main plugin file):/* This is the function that toggles a post status from draft to published */
add_action( \'wp_ajax_approvepost\', \'approvepost_callback\' );
add_action( \'wp_ajax_nopriv_approvepost\', \'approvepost_callback\' );
function approvepost_callback(){
$update = array();
for($i=0;$i<count($_POST[\'postid\']);$i++){
$post = array(
\'ID\' => $_POST[\'postid\'][$i],
\'post_status\' => \'publish\'
);
$update[$i] = wp_update_post($post);
}
echo json_encode($update);
wp_die();
}