WP_UPDATE_POST不会将发布状态从草稿更改为发布,返回1

时间:2021-06-02 作者:TARKUS

我正在为前端编写一个审批后实用程序,因为我们不希望编辑器能够访问管理仪表板。堆栈上的问题与我试图完成的几乎相同,但这家伙的问题与无限循环问题有关。否则,他声称他的代码有效:

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(); 
      }
      

    2 个回复
    最合适的回答,由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()) 电话:

    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}} — 比简单好01, 对吗?:)

    SO网友:Kàrthîk ßàlàkrìshña

    这可能是一个奇怪的答案,因为我认为它与ajax无关。。。。请尝试清除缓存,或安装1并清除缓存,然后在选择post name的情况下保存永久链接

    相关推荐

    自定义“The_Posts_Pagination”并将列表放入div

    Hello everybody, 我需要有关自定义wordpress分页的帮助。我想得到这个:这就是我所做的:在函数中。php,我添加了以下代码:function wp_custom_pagination($args = [], $class = \'pagination\') { if ($GLOBALS[\'wp_query\']->max_num_pages <= 1) return; $args = wp_parse_args( $args,