Problem:
The customer created a many-to-many relationship between posts and products using Toolset and WooCommerce. When a connected product is "trashed," the connection is not automatically deleted, resulting in empty product cells in the grid view. The customer wanted a way to either filter out intermediary posts with trashed children or automatically delete the connections when a product is trashed.
Solution:
We provided a custom function using the wp_trash_post hook to automatically disconnect any intermediary posts associated with a product when it is trashed. The function also initially moved the intermediary posts to the trash, but this behavior was corrected to ensure only the connections were deleted without affecting the original post status. The code was updated to handle multiple relationships and ensure the associated posts remain published even after a product is trashed.
Final code:
The function disconnects intermediary posts while ensuring that the associated posts remain published.
The customer confirmed that the final solution worked correctly after adding an additional check to maintain the post's published status:
add_action('wp_trash_post', 'delete_relationships_on_trashed_product', 101, 2); function delete_relationships_on_trashed_product($post_id, $previous_status) { // Get the post object based on the post ID $post = get_post($post_id); // Ensure we have a valid post object and that it is of type 'product' if ($post && $post->post_type === 'product') { // Define the relationship slugs to check $relationship_slugs = ['post-product', 'post-product-2', 'post-product-3']; // Loop through each relationship slug and handle the disconnection foreach ($relationship_slugs as $relationship_slug) { // Get all intermediary posts related to this product for the current relationship slug $related_intermediary_posts = toolset_get_related_posts( $post_id, // ID of the post to get relationships from $relationship_slug, // Relationship slug 'child', // Role of $post_id in this relationship -1, // Limit to get all related posts 0, // Offset [], // Additional arguments 'post_id', // Return type, we want the post IDs 'parent' // We want to get the parent posts related to this child ); // Loop through each intermediary post and delete the relationship if (!empty($related_intermediary_posts)) { foreach ($related_intermediary_posts as $intermediary_post_id) { // Disconnect the intermediary post $disconnect_result = toolset_disconnect_posts($relationship_slug, $intermediary_post_id, $post_id); // After disconnecting, ensure the parent post remains published // Get the parent post object $parent_post = get_post($intermediary_post_id); // Check if the post status is not 'publish' and update it to 'publish' if ($parent_post && $parent_post->post_status !== 'publish') { wp_update_post([ 'ID' => $parent_post->ID, 'post_status' => 'publish' ]); } } } } } }
Relevant Documentation:
https://developer.wordpress.org/reference/hooks/wp_trash_post/
https://toolset.com/documentation/customizing-sites-using-php/post-relationships-api/#toolset_disconnect_posts
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 |
---|---|---|---|---|---|---|
- | 9:00 – 12:00 | 9:00 – 12:00 | 9:00 – 12:00 | 9:00 – 12:00 | 9:00 – 12:00 | - |
- | 13:00 – 18:00 | 13:00 – 18:00 | 13:00 – 18:00 | 13:00 – 18:00 | 13:00 – 18:00 | - |
Supporter timezone: America/Sao_Paulo (GMT-03:00)
This topic contains 6 replies, has 2 voices.
Last updated by 3 months, 1 week ago.
Assisted by: Mateus Getulio.