我正在为前端编写一个审批后实用程序,因为我们不希望编辑器能够访问管理仪表板。堆栈上的问题与我试图完成的几乎相同,但这家伙的问题与无限循环问题有关。否则,他声称他的代码有效:
How to change post status from publish to draft using hook in wordpress?
我正在编写一个插件来实现这一点(在我的例子中,我想将“草稿”更改为“发布”)。我不想编辑这些函数。php的子主题,因为我希望插件是独立的,对于任何WordPress站点。所以所有代码都在插件的主php文件中。
我可以获得所有状态为“草稿”的帖子
我可以使用html复选框、javascript和WP的ajax函数来选择我要按ID更改的帖子。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();
}
最合适的回答,由SO网友:Sally CJ 整理而成
关于wp\\u update\\u post的一些内容不喜欢被AJAX调用。
不,没有这样的事。:)
我怀疑这与安全有关
我认为情况并非如此,因此我要求您提供JS代码。
而实际的问题是POST参数postid
(即。$_POST[\'postid\']
) 实际上是post id的数组,所以您不能简单地\'ID\' => $_POST[\'postid\']
. 关于这一点:wp\\u update\\u post返回1;,这是因为函数调用get_post()
事实上是那个1
. 这也意味着,被更新的帖子就是具有该ID的帖子,即。1
(这是默认WordPress安装中的“Hello world!”帖子)。
所以你需要做一个foreach
然后打电话wp_update_post()
更新每个帖子。基于代码的示例:
function approvepost_callback() {
$data = array();
foreach ( (array) $_POST[\'postid\'] as $post_id ) {
if ( empty( $post_id ) || ! is_numeric( $post_id ) ) {
continue;
}
$post = array(
\'ID\' => $post_id,
\'post_status\' => \'publish\',
\'edit_date\' => true // what is edit_date?
);
$result = wp_update_post( $post, true );
if ( $result && ! is_wp_error( $result ) ) {
$data[] = $post_id;
}
}
// In your JS, you set dataType to \'json\', so make sure to send a valid JSON response.
wp_send_json( $data ); // this function will call wp_die()
}
一些JavaScript注释不需要以下内容else
因为它将向数组中添加空项(data.postid
):
else{
data.postid[i] = "";
}
在继续使用AJAX之前,我会确保上面的数组不是空的(
$.ajax()
) 电话:
if ( data.postid.length < 1 ) {
console.log( \'no selections\' );
return;
}
$.ajax( ... your code here. );
And last but not least... 您应该考虑使用REST API来更新帖子(请参阅
Update a Post endpoint), 因为REST API具有更好的错误处理能力,例如,如果您指定了无效/不存在的post ID,则响应看起来会是这样,这会告诉您到底出了什么问题:
{code: "rest_post_invalid_id", message: "Invalid post ID.", data: {status: 404}}
— 比简单好
0
或
1
, 对吗?:)