web-dev-qa-db-ja.com

親が削除されたらすべての子を削除 - フロントエンド

私はうまく機能しているフロントエンドページの削除を有効にするために使用しているこの機能を持っています

function delete_post(){
global $post;
$deletepostlink= add_query_arg( 'frontend', 'true',   get_delete_post_link( get_the_ID() ) );
if (current_user_can('edit_post', $post->ID)) {
    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 ) ) {
    wp_redirect( get_option('siteurl').'/' );
    exit;
}
}

そして、私はこれを使用してボタンのための私のテンプレートファイルです

<?php echo delete_post(); ?>

私が達成しようとしているのは、ユーザーがフロントエンドからページを削除したときに、その親ページのすべての子ページも削除される(またはゴミ箱に移動する)ということです。

ありがとう

1
joelybristol

さて、おもしろい質問です。私が調べた限りでは、投稿の削除時にフックが呼び出されるのは、削除された投稿IDをパラメータとして渡すことです。親ページを削除するときはうまくいきますが、子ページを削除するためにtrashed_postに関数をフックしたときにはうまくいかないでしょう。子ページだからそれは期待通りには動作しません。

それでは解決策を見つけてください。ここでは、子ページの投稿ステータスをtrash-に変更するために、SQLコマンドで関数を書き換えました。

function delete_post(){
    global $post;
    $deletepostlink= add_query_arg( 'frontend', 'true',   get_delete_post_link( get_the_ID() ) );
    if (current_user_can('edit_post', $post->ID)) {
        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' => 'page'
        );
        // 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);
        wp_redirect( get_option('siteurl').'/' );
        exit;
    }
}

お役に立てば幸いです。

1
CodeMascot