So what I have come to realise is that I cannot just show the parks that have 'any' properties linked.
I have a taxonomy which allows people to mark the properties as;
For Sale, Sold, Draft/Save for later or Under Offer.
Anything Sold has been removed from any listings on the website.
However, using this formula works, but it still shows the parks that have attached Sold items.
Is there a way I can also negate 'Sold' items from the search even though they're attached via a relationship?
For example;
You can see each park has 1 Private Sale(s), but Rownhams Park does not.
This is because the one attached to Rownhams Park has been marked as 'Sold', so shouldn't technically show on this list.
Any help with this would be greatly appreciated, I am soo very nearly there with it!
To additionally exclude the holiday park posts, where all the related holiday home posts have the "Status" taxonomy term "Sold", you can extend the custom code to:
add_filter( 'wpv_filter_query', 'filter_no_parent_park_posts_fn', 1000 , 3 );
function filter_no_parent_park_posts_fn( $query_args, $view_settings ) {
if ( ( isset($view_settings['view_id']) && $view_settings['view_id'] == 109) ) {
// change these values, as per your website
$target_post_type = "holiday-park";
$relationship_slug = "holiday-park-holiday-home";
// cycle through all target posts
$args = array(
'posts_per_page' => -1,
'post_type' => $target_post_type,
'post_status' => 'publish',
);
$posts_array = get_posts( $args );
// get all related posts of the target posts
foreach ($posts_array as $post_array ) {
$get_results = toolset_get_related_posts( $post_array -> ID, $relationship_slug, 'parent', 999999, 0, array(), 'post_id', 'child' );
// if the related post doesn't exist, remove the target post from the view's results
if(empty($get_results)) {
$query_args['post__not_in'][] = $post_array -> ID;
} else {
//if the related post exists, check if all of them are sold
$sold_count = 0;
foreach ($get_results as $get_result) {
if (has_term( 'Sold', 'home-status', $get_result)) {
$sold_count++;
}
}
//if all of them are sold, remove the target post from the view's results
if( $sold_count == count($get_results) ) {
$query_args['post__not_in'][] = $post_array -> ID;
}
}
}
}
return $query_args;
}
And then you can add similar changes to the code snippet for the view with the map.
Note: The custom code examples from our forum are shared to get you started in the right direction. You're welcome to adjust them as needed and for more personalized customization assistance, you can consider hiring a professional from our list of recommended contractors: https://toolset.com/contractors/
To additionally exclude the holiday park posts, where all the related holiday home posts have the "Status" taxonomy term "Sold", you can extend the custom code to:
add_filter( 'wpv_filter_query', 'filter_no_parent_park_posts_fn', 1000 , 3 );
function filter_no_parent_park_posts_fn( $query_args, $view_settings ) {
if ( ( isset($view_settings['view_id']) && $view_settings['view_id'] == 109) ) {
// change these values, as per your website
$target_post_type = "holiday-park";
$relationship_slug = "holiday-park-holiday-home";
// cycle through all target posts
$args = array(
'posts_per_page' => -1,
'post_type' => $target_post_type,
'post_status' => 'publish',
);
$posts_array = get_posts( $args );
// get all related posts of the target posts
foreach ($posts_array as $post_array ) {
$get_results = toolset_get_related_posts( $post_array -> ID, $relationship_slug, 'parent', 999999, 0, array(), 'post_id', 'child' );
// if the related post doesn't exist, remove the target post from the view's results
if(empty($get_results)) {
$query_args['post__not_in'][] = $post_array -> ID;
} else {
//if the related post exists, check if all of them are sold
$sold_count = 0;
foreach ($get_results as $get_result) {
if (has_term( 'Sold', 'home-status', $get_result)) {
$sold_count++;
}
}
//if all of them are sold, remove the target post from the view's results
if( $sold_count == count($get_results) ) {
$query_args['post__not_in'][] = $post_array -> ID;
}
}
}
}
return $query_args;
}
And then you can add similar changes to the code snippet for the view with the map.
Note: The custom code examples from our forum are shared to get you started in the right direction. You're welcome to adjust them as needed and for more personalized customization assistance, you can consider hiring a professional from our list of recommended contractors: https://toolset.com/contractors/
Then I wanted to expand on that and remove 2 of the taxonomies, 'Draft / Save for later' and 'Sold'.
So I tried copying from } else { downwards and that didn't work.
I tried adding an extra taxonomy in brackets like ('Sold', 'Draft / Save for later').
That didn't work either.
I added the full code again and made it unique to 'Draft / Save for later' and it works how I want.
Now all posts that are in 'Draft / Save for later' and 'Sold' do not show.
Even though I have my end result, is this the best way to do this?
What I don't want to do is bugger things up for me in the future.
if (has_term( 'Sold', 'home-status', $get_result)) {
To:
if (has_term( array('Sold', 'Draft / Save for Later'), 'home-status', $get_result)) {
Additionally, you don't have to use two different code snippets, to apply the same filtering to, two different views (one for normal and one for the map only).
You can use the same snippet to target multiple views, by changing the line:
if ( ( isset($view_settings['view_id']) && $view_settings['view_id'] == 5938) ) {