I found the solution. The problem was the action 'delete_post'.
I've changed it to 'trash_to_publish' based on the Post Status Transitions: https://codex.wordpress.org/Post_Status_Transitions
Now everything works fine.
/**
* Deletes all posts from author of company profile.
*/
function delete_all_posts_from_author($post_id) {
global $post;
$id = $post->ID;
// Only trigger if post type is "company"
if ( get_post_type($id) == "company" ) {
$author_id = $post->post_author;
$posts_from_author = get_posts(
array(
'posts_per_page' => -1,
'post_status' => 'publish',
'post_type' => array('event','job'),
'author' => $author_id,
'fields' => 'ids', // Only get post ID's
)
);
foreach ( $posts_from_author as $post_from_author ) {
wp_trash_post( $post_from_author, false); // Set to False if you want to send them to Trash.
}
}
}
add_action( 'publish_to_trash', 'delete_all_posts_from_author', 10, 1 );
As a bonus I could use the function to publish all posts from a user again if I untrash the company profile.
/**
* Untrash posts if company profile is untrashed
*/
function untrash_all_posts_from_author($post_id) {
global $post;
$id = $post->ID;
if ( get_post_type($id) == "company" ) {
$author_id = $post->post_author;
$posts_from_author = get_posts(
array(
'posts_per_page' => -1,
'post_status' => 'trash',
'post_type' => array('event','job'),
'author' => $author_id,
'fields' => 'ids', // Only get post ID's
)
);
foreach ( $posts_from_author as $post_from_author ) {
wp_untrash_post( $post_from_author); // Set to False if you want to send them to Trash.
}
}
}
add_action( 'trash_to_publish', 'untrash_all_posts_from_author', 10, 1 );
Hope that helps. And please let me know if I've made a mistake.
EDIT: I've changed the argument wp_delete_post()
to wp_trash_post()
because wp_delete_post()
only applies to native posts, pages, and attachments. Great answer from @rarst here: https://wordpress.stackexchange.com/questions/281877/error-after-deleting-custom-post-type-with-a-function-no-trash-used/281888#281888