Skip Navigation

[Resolved] View with child post type: hide posts where parent is private/concept (part 3)

This thread is resolved. Here is a description of the problem and solution.

Problem: I have a post relationship between two post types. I want to show a View of child posts where the parent post is not private.

Solution: Use custom code to test each child post's parent. Private parent posts will not be returned for any guest Users. Also test the post status, so logged-in Users will not see child posts of their own private parent posts.

add_filter('wpv_filter_query', 'ts_parent_not_private_func', 10, 3);
function ts_parent_not_private_func($query, $view_settings, $view_id) {
  $views = array( 16813, 16403 ); // only filter these views
  if( in_array( $view_id, $views ) ) {
    $child_ids = array(); // we will push IDs here if the parent is not found, or private
    $children_args = array(
      'post_type' => 'training-datum',
      'posts_per_page' => '-1',
      'post_status' => 'publish',
      // you may want to add more filters here to improve the performance of this query
    );
    $children = new WP_Query($children_args);
    foreach( $children->posts as $child ){
      $parent = toolset_get_related_post( $child, 'training_training-datum', 'parent' );
      // if there is no parent or the parent is private, push this ID into the exclusion array
      if( !$parent || get_post_status($parent) == 'private' ){
        array_push( $child_ids, $child->ID );
      }
    }
 
    $query['post__not_in'] = isset( $query['post__not_in'] ) ? $query['post__not_in'] : array();
    $query['post__not_in'] = array_merge($query['post__not_in'], $child_ids );
  }
  return $query;
}

Relevant Documentation:
https://toolset.com/documentation/programmer-reference/views-filters/#wpv_filter_query
https://toolset.com/documentation/customizing-sites-using-php/post-relationships-api/#toolset_get_related_post
https://codex.wordpress.org/Class_Reference/WP_Query

This support ticket is created 6 years ago. There's a good chance that you are reading advice that it now obsolete.

This is the technical support forum for Toolset - a suite of plugins for developing WordPress sites without writing PHP.

Everyone can read this forum, but only Toolset clients can post in it. Toolset support works 6 days per week, 19 hours per day.

Sun Mon Tue Wed Thu Fri Sat
8:00 – 12:00 8:00 – 12:00 8:00 – 12:00 8:00 – 12:00 8:00 – 12:00 - -
13:00 – 17:00 13:00 – 17:00 13:00 – 17:00 13:00 – 17:00 13:00 – 17:00 - -

Supporter timezone: America/New_York (GMT-04:00)

This topic contains 5 replies, has 2 voices.

Last updated by martijnH 6 years ago.

Assisted by: Christian Cox.

Author
Posts
#1132778
Screenshot-MH-20181023-13-loggedin.png
Screenshot-MH-20181023-13-loggedout.png

Sorry, my ticket https://toolset.com/forums/topic/view-with-child-post-type-hide-posts-where-parent-is-private-concept-2/ was not resolved.

I was logged in and eveything looked right. The childs with private parents were not shown. But when I logged out, the childs with private parent showed up again in the view.

See screenshots and hidden link

#1132831

I see, I overlooked the fact that guests cannot see private posts so the related post queries based on the parent post are failing. We can take a different approach that tests whether or not a parent post is found for each child, as well as the parent post status (if it exists). This should fix the problem for all Users, assuming that you do not want to show any child posts that have no parent.

add_filter('wpv_filter_query', 'ts_parent_not_private_func', 10, 3);
function ts_parent_not_private_func($query, $view_settings, $view_id) {
  $views = array( 16813, 16403 ); // only filter these views
  if( in_array( $view_id, $views ) ) {
    $child_ids = array(); // we will push IDs here if the parent is not found, or private
    $children_args = array(
      'post_type' => 'training-datum',
      'posts_per_page' => '-1',
      'post_status' => 'publish',
      // you may want to add more filters here to improve the performance of this query
    );
    $children = new WP_Query($children_args);
    foreach( $children->posts as $child ){
      $parent = toolset_get_related_post( $child, 'training_training-datum', 'parent' );
      // if there is no parent or the parent is private, push this ID into the exclusion array
      if( !$parent || get_post_status($parent) == 'private' ){
        array_push( $child_ids, $child->ID );
      }
    }

    $query['post__not_in'] = isset( $query['post__not_in'] ) ? $query['post__not_in'] : array();
    $query['post__not_in'] = array_merge($query['post__not_in'], $child_ids );
  }
  return $query;
}

Check the post type slug "training-datum", I'm assuming this is correct but you may need to change it.

#1133332

Sorry to say this does not work for me. I still have the same result.

Just to be sure: In the yellow resolution box on https://toolset.com/forums/topic/view-with-child-post-type-hide-posts-where-parent-is-private-concept-2/ you write "...so that the View only shows children of parents that are marked private"

This should be "... so that the View only shows children of parents that are NOT marked private". Do not know this makes a difference for the solution.

#1133452

May I log in to see why this isn't working as expected? Please provide login credentials in the private fields here and I'll take a closer look.

#1133649

Okay check now, I made a transposition error here:

'posts_per_page' => '1',

That should have been '-1' to get all the posts. I made that change in the functions.php file for you so be sure to pull that down to your local repository.

#1134074

My issue is resolved now. Thank you!