如何为所有特色图像设置Status=‘Publish’?

时间:2019-05-16 作者:ludovico

背景:

我遇到了这个WP问题:https://core.trac.wordpress.org/ticket/41445

简而言之:当您通过REST API向帖子发出请求时,如果特色图片最初上载到其他帖子,而此帖子无法通过REST API访问(例如,原始帖子被丢弃,是草稿等),您将获得403 error.

这是WordPress API中的一个bug,尚未修复。

显然,之所以会发生这种情况,是因为所有附件都从其父帖子继承了状态(在数据库中,post_status=\'inherit\')

可能的解决方法如下this suggestion, 我已经更新了数据库中当前所有图像的状态:
UPDATE wp_posts
SET post_status=\'publish\'
WHERE post_type = \'attachment\'
AND post_mime_type LIKE \'image/%\';
这修复了我当前拥有的所有图像的问题。。。但它显然无法修复将来将上传的任何图像。

我可以额外拨款capabilities 给我的用户edit_posts, edit_private_postsedit_others_posts.

解决了问题,但绝对不理想。。。

永久解决方案add_attachment 在图像上传到WP后立即更改状态?

我错过什么了吗?有没有更好的方法?

更新(2019年6月)

如评论中所述,@cjbj的回答完全符合我的要求(上传新附件时,它会将此附件的状态设置为“发布”)。不幸的是,此解决方案似乎会破坏媒体库,因为它不会显示post\\u status=\'publish\'的图像/附件。

对于任何面临同样问题的人,我建议采取向用户添加额外功能的方式。

1 个回复
最合适的回答,由SO网友:cjbj 整理而成

如果我理解正确,您希望在上载时将所有附件状态设置为“发布”,而不是“继承”,以防止在父帖子状态更改时更改该状态。让我们看看wp_insert_post 如果它提供了任何可能性。

首先在第3483行(当前版本),如果是附件帖子,帖子状态设置为“继承”:

if ( \'attachment\' === $post_type && ! in_array( $post_status, array( \'inherit\', \'private\', \'trash\', \'auto-draft\' ), true ) ) {
    $post_status = \'inherit\';
稍后(第3683行)所有post参数compacted 放入一个名为data:

$data = compact( \'post_author\', \'post_date\', \'post_date_gmt\', \'post_content\', \'post_content_filtered\', \'post_title\', \'post_excerpt\', \'post_status\', \'post_type\', \'comment_status\', \'ping_status\', \'post_password\', \'post_name\', \'to_ping\', \'pinged\', \'post_modified\', \'post_modified_gmt\', \'post_parent\', \'menu_order\', \'post_mime_type\', \'guid\' );
然后(第3703行)还有一个过滤器:

$data = apply_filters( \'wp_insert_attachment_data\', $data, $postarr );
这样,您就有了一个过滤器,它允许您在附件数据实际存储到数据库之前更改附件数据。您可以这样利用它:

add_filter (\'wp_insert_attachment_data\',\'wpse448037_force_attachment_publish\', 10, 2)
function wpse448037_force_attachment_publish ($data, $postarr) {
  $data[\'post_status\'] = \'publish\';
  return $data;
  }
请注意,我没有测试此代码,因此可能需要进行一些调试。