Wp_UPDATE_POST()有哪些限制?

时间:2017-03-03 作者:38365

我在wp\\u posts表中有两个字段wp_update_post() 似乎无法改变。我正在尝试使用以下代码:

$echo $group_access;
$echo $tag_list;
$my_post = array(
      \'ID\'           => 12095, 
      \'post_title\'   => \'Test Title\',
      \'post_content\' => \'Test Content\',     
      \'group_access\' => $group_access,
      \'tag_list\'     => $tag_list,
  );
// Update the post into the database
$post_id = wp_update_post( $my_post, true );

if (is_wp_error($post_id)) {
    $errors = $post_id->get_error_messages();
    foreach ($errors as $error) {
        echo $error;
    }
}
The$group_access$tag_list 变量返回正确的值。这个post_titlepost_content 正确更新。group_accesstag_list 不要更新,也没有错误。

当然,我已经检查了表格group_accesstag_list 是正确的列标题。

我对它为什么不起作用感到困惑。是wp_update_post() 无法更改不属于默认WP安装的列?它是否可能是一种数据类型(例如,我应该传递一个数组或整数,但我传递的是一个字符串)?

2 个回复
SO网友:Dave Romsey

你是对的;WordPress不会使用更新自定义数据库列wp_update_post()wp_insert_post(). 与其创建自定义数据库列,不如考虑使用post meta和/或taxonomy API。

如果你必须祭坛wp_posts 表中,您将需要自己更新自定义列,并且您可能会遇到其他各种插件的问题,这些插件没有考虑自定义数据库列。

SO网友:Nathan Johnson

wp_insert_post_data 几乎在post数据插入数据库之前立即激发。在此之后发生的唯一事情是$数据wp_unslash(). 您应该能够使用此筛选器将发送的wp\\u update\\u post的$postarr与传递给此筛选器的$postarr进行比较。如果两者不同,则可以在将$数据插入数据库之前对其进行格式化。

我很快就把它做成了模型。尚未对其进行测试,但应稍加修改即可工作。

wpse-258786级。php:

class wpse_258786 {
  protected $postarr;
  public function __construct( $postarr ) {
    $this->postarr = $postarr;
  }
  public function insert_post_data( $data, $postarr ) {
    //* Make sure this is added each time before each post
    remove_action( \'wp_insert_post_data\', [ $this , \'insert_post_data\' ] , 10 );

    if( $postarr !== $this->postarr ) {
      //* Format the $data to insert into table
    }
    return $data;
  }
}
在您的文件中。php

include_once( PATH_TO . \'class-wpse-258786.php\' );

...

$echo $group_access;
$echo $tag_list;
$my_post = array(
      \'ID\'           => 12095, 
      \'post_title\'   => \'Test Title\',
      \'post_content\' => \'Test Content\',     
      \'group_access\' => $group_access,
      \'tag_list\'     => $tag_list,
  );

//* Filter the post data before inserting into database
add_action( \'wp_insert_post_data\',
  [ new wpse_258786( $my_post ), \'insert_post_data\' ], 10, 2 );

// Update the post into the database
$post_id = wp_update_post( $my_post, true );
编辑以添加:我要做的是将该类放在一个单独的文件中,包含一次,然后将过滤器添加到该类中。然后就在你面前wp_update_post() 在构造函数中添加带有post数据的筛选器。当挂钩启动时,您可以移除过滤器,以确保它不会启动多次。

作为对您评论的回应,您可以使用$wpdb,事实上,这就是wp_insert_post() 确实如此。使用wp_insert_post() 抽象是因为它引入了许多操作和过滤器挂钩,我们可以使用这些挂钩在数据输入数据库之前修改数据。查看wp_insert_post() trac上的功能。

相关推荐