问题描述

有没有一些 wordpress 魔术/插件,将使媒体库只显示上传到特定的自定义帖子类型的图像?我有一个名为”artists” 的自定义帖子类型,我想要,当管理员单击上传/附加图像时,媒体库弹出窗口只显示已上传到艺术家自定义类型的图像,而不是整个网站。

我使用 ACF 插件来处理自定义字段,以及定制的 post 类型 ui 。这可能吗?

最佳解决方案

我不是 100%肯定如果我得到你的问题正确,但… 也许这将帮助你…

媒体上传器使用简单的 WP_Query 获取附件,因此您可以使用许多过滤器来修改其内容。

唯一的问题是,您不能使用 WP_Query 参数查询具有特定 CPT 的帖子作为父级,所以我们必须使用 posts_whereposts_join 筛选器。

可以肯定的是,我们只会更改媒体上传者的查询,我们将使用 ajax_query_attachments_args

这是它的外观,组合时:

function my_posts_where($where) {
    global $wpdb;

    $post_id = false;
    if ( isset($_POST['post_id']) ) {
        $post_id = $_POST['post_id'];

        $post = get_post($post_id);
        if ( $post ) {
            $where .= $wpdb->prepare(" AND my_post_parent.post_type = %s ", $post->post_type);
        }
    }

    return $where;
}

function my_posts_join($join) {
    global $wpdb;

    $join .= " LEFT JOIN {$wpdb->posts} as my_post_parent ON ({$wpdb->posts}.post_parent = my_post_parent.ID) ";

    return $join;
}


function my_bind_media_uploader_special_filters($query) {
    add_filter('posts_where', 'my_posts_where');
    add_filter('posts_join', 'my_posts_join');

    return $query;
}
add_filter('ajax_query_attachments_args', 'my_bind_media_uploader_special_filters');

当您编辑帖子 (帖子/页面/CPT) 时打开媒体上传器对话框时,您只会看到附加到此特定帖子类型的图像。

如果你希望它只适用于一个特定的帖子类型 (就是说页面),你必须改变 my_posts_where 函数的条件,就像这样:

function my_posts_where($where) {
    global $wpdb;

    $post_id = false;
    if ( isset($_POST['post_id']) ) {
        $post_id = $_POST['post_id'];

        $post = get_post($post_id);
        if ( $post && 'page' == $post->post_type ) {  // you can change 'page' to any other post type
            $where .= $wpdb->prepare(" AND my_post_parent.post_type = %s ", $post->post_type);
        }
    }

    return $where;
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。