1

I've got a function working to delete a post and it's children. How can I amend this to delete it's grand children too?

<?php
function delete_post($sectionid)
{
    global $post;
    $deletepostlink= add_query_arg( 'frontend', 'true', get_delete_post_link( $sectionid) );

    if (current_user_can('edit_post', $sectionid)) {
    echo '<span><a class="post-delete-link" onclick="return confirm(\'Are you sure to delete?\')" href="' . $deletepostlink . '">Delete  this </a> </span>';
    }
}

//Redirect after delete post in frontend
add_action('trashed_post','trash_redirection_frontend');

function trash_redirection_frontend($post_id )
{
    if ( filter_input( INPUT_GET, 'frontend', FILTER_VALIDATE_BOOLEAN ) ) {

        $args = array(
            'posts_per_page' => -1,
            'order'=> 'ASC',
            'post_parent' => $post_id,
            'post_type' => 'bucket'
        );

        // Filter through all pages and find Portfolio's children
        $children = get_children( $args );
        global $wpdb;

        foreach($children as $child){
            $childs[$child->ID] = $child->ID;
        }

        $sql = "UPDATE {$wpdb->posts} SET post_status = 'trash' WHERE ID IN   (" . implode( ', ', $childs ) . ")";
        $wpdb->query($sql);
        $referer = $_SERVER['HTTP_REFERER'];
        wp_redirect( $referer );
        exit;
    }
}

I need another foreach, but my PHP is only basic so far.

  • 1
    Try this answer: wordpress.stackexchange.com/a/53989/2807 – Dave Romsey Mar 9 '17 at 22:44
  • 1
    @DaveRomsey thanks for that Dave, I did see that but wasnt quite sure how to amend my markup to suit! Will keep on trying though and going to continue my online tuition of php / wordpress! Getting there though – joelybristol Mar 9 '17 at 23:17
0

Here's what you can do:

  1. get all the ids of direct children
  2. get all ids of grand children
  3. combine
  4. trash

    function trash_redirection_frontend($post_id )
    {
    if ( filter_input( INPUT_GET, 'frontend', FILTER_VALIDATE_BOOLEAN ) ) {
    
        $args = array(
            'posts_per_page' => -1,
            'post_parent' => $post_id,
            'post_type' => 'bucket',
            'fields' => 'ids', // get only the ids, it's all we need
        );
    
        // get all children ids
        $children = get_posts( $args );
        $all_parents = array_merge( [ $post_id ], $children );
    
        // get all grand_children
        $args['post_parent__in'] = $children;
        unset( $args['post_parent'] ); // we're using the above array now
    
        $grand_children = get_posts( $args );
    
        // $all_posts now contains all affected ids
        $all_posts = array_merge( $all_parents, $grand_children );
    
        foreach($all_posts as $child){
            wp_trash_post( $child ); // use this unless you have good reason to query directly
        }
    
        $referer = $_SERVER['HTTP_REFERER'];
        wp_redirect( $referer );
        exit;
    }
    }
    
  • Hey, apologies for late response! This isn't working for me, it's only deleting top two levels! – joelybristol Mar 15 '17 at 8:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.