0

So when I am creating a post, I would like to only be able to see images (after clicking ,add media above wp editor) that have been uploaded and attached to posts of the same family of the current post i'm creating.

My current code does not seem to work.

global $post;

$parentID = $post->post_parent; //Shows 2068
$currID = $post->ID; //Shows 2069

$args = array('post_parent' => $post->ID, 'post_type' => 'projects', 'numberposts' => -1  );
        $children = get_children($args);

        foreach ($children as $child):
            $childIDs .= " ".$child->ID; //Get Children IDs
        endforeach;

$allIDs = $parentID." ".$currID.$childIDs; //shows 2068 2069 2070 2071

add_filter( 'ajax_query_attachments_args', 'wpb_show_current_user_attachments');

function wpb_show_current_user_attachments( $query, $allIDs ) {

    $allIDarray = explode (" ", $allIDs); 
    //$user_id = get_current_user_id();

    if ( $user_id && !current_user_can('activate_plugins') && !current_user_can('edit_others_posts') ) {

        // $query['author'] = $user_id;
        $query['post_parent'] = $allIDarray;

    }
    return $query;
} 
| improve this question | | | | |
  • Can you ellaborate further what you mean by family? Is that a custom taxonomy? Where have you put your code? – Tom J Nowell Jul 22 '19 at 6:24
  • @TomJNowell Well my post family is Parent/Child/GrandChild.. When I upload any images within the family, I just wanted to show those images as choices when I click add Media. – samjco Jul 22 '19 at 6:27
  • There's only one parameter that ajax_query_attachments_args sends to its callbacks. And what are those code above the add_filter()? They should be in the callback. – Sally CJ Jul 22 '19 at 10:14
  • this is close to what I am trying to do, but I wanted to add more family posts IDs dynamically: wordpress.stackexchange.com/questions/156319/… – samjco Jul 22 '19 at 12:09
0

You need to alter the query using posts_where and posts_join filters.

function restrict_media_images_per_post_type($query) {
    add_filter('posts_where', 'media_posts_where');
    add_filter('posts_join', 'media_posts_join');
    return $query;
}
add_filter('ajax_query_attachments_args', 'restrict_media_images_per_post_type');

Change "WHERE" clause to restrict to specific post type to which selected post belongs to

function media_posts_where($where) {
    global $wpdb;
    $post_id = false;
    $whitelist_post_type = array(
        'post',
        '{custom post type}' //change this according to your need e.g. projects
    );
    if ( isset($_POST['post_id']) ) {
        $post_id = $_POST['post_id'];
        $post = get_post($post_id);
        if ( $post && in_array($post->post_type, $whitelist_post_type)) {
            $where .= $wpdb->prepare(" AND my_post_parent.post_type = %s ", $post->post_type);
            //$where .= $wpdb->prepare(" AND my_post_parent.post_type = %s AND {$wpdb->posts}.post_parent = %d", $post->post_type, $_POST['post_id']);  //Use this if you want to restrict to selected post only
        }
    }
    return $where;
}

Change "JOIN" clause to get media by restricting to the post parent

function media_posts_join($join) {
    global $wpdb;
    if ( isset($_POST['post_id']) ) {
        $join .= " LEFT JOIN {$wpdb->posts} as my_post_parent ON ({$wpdb->posts}.post_parent = my_post_parent.ID) ";
    }
    return $join;
}
| improve this answer | | | | |
0

Got it working!! :) Final Code:

function wpse156319_posts_where( $where, $query ) {

    global $wpdb;

    $currentID = $_POST['post_id']; //shows 2069
    $post = get_post($currentID); //shows 2068
    $parentID = $post->post_parent;
    $chargs = array('post_parent' => $post->ID, 'post_type' => 'projects' );
    $children = get_children($chargs);


    $where .= ' AND (';

    if($children):
        foreach ($children as $child):
            $where .= $wpdb->posts . '.post_parent = '.$child->ID.' OR ';
        endforeach;
    endif;

    if($parentID):
        $where .= $wpdb->posts . '.post_parent = '.$parentID.' OR ';
    endif;

    $where .= $wpdb->posts . '.post_parent = '.$currentID;

    $where .= ')';

    return $where;

}

add_filter( 'ajax_query_attachments_args', 'filterMediaLibrary', 10, 2 );

function filterMediaLibrary($query = array()) {

    add_filter( 'posts_where', 'wpse156319_posts_where', 10, 2 );

    return $query;

}
| improve this answer | | | | |
  • 1
    Actually, you can do it without having to use the posts_where filter (or without having to write custom SQL) - see this example where I used get_post_ancestors() to get the post's parent, grandpa, great grandpa, etc. – Sally CJ Jul 23 '19 at 5:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.