Types plugin lets you easily create relationships between different post types and connect them using GUI controls. You can also connect multiple post types and build many-to-many post relationships.
When you ask for help or report issues, make sure to tell us what you have created so far and the structure that you want to achieve.
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'
]);
}
}
}
}
}
}