サポート » 使い方全般 » マルチサイトで特定の投稿タイプを一括削除する方法について

  • 解決済 igawan

    (@igawan)


    下記のように記載したPHPを設置して投稿タイプが「post_type_name」となっているものを削除しておりまして、テーブル名「wp_posts」については正常に削除できました。

    <?php
    // WordPress関数を動くようにする
    require_once( dirname(__FILE__) . '/wp-load.php' );
    
        // wpdbでデータベースを直接検索しています。
        $query_text = "SELECT ID FROM wp_posts WHERE post_type = 'post_type_name'";
        $query_result = $wpdb->get_results($query_text);
    
        // 削除したリスト
        $delete_post_ids = "";
        // 削除に失敗したリスト
        $not_found_post_id = "";
        foreach($query_result as $item) {
            $id = $item->ID;
            if (wp_delete_post($id, $force_delete) === false) {
                $not_found_post_id .= "<li>$id</li>";
            } else {
                $delete_post_ids .= "<li>$id</li>";
            }
        }
    
        if (empty($delete_post_ids)) {
            echo "<p>対象の投稿が見つかりませんでした。</p>";
        } else {
            if ($force_delete === true) {
                echo "<p>次の投稿を削除しました。</p>";
            } else {
                echo "<p>次の投稿をゴミ箱に移動しました。</p>";
            }
            echo '<ul>';
            echo $delete_post_ids;
            echo '</ul>';
        }
    
        if (empty($not_found_post_id) === false) {
            if ($force_delete === true) {
                echo "<p>次の投稿を削除できませんでした。</p>";
            } else {
                echo "<p>次の投稿をゴミ箱に移動できませんでした。</p>";
            }
            echo '<ul>';
            echo $not_found_post_id;
            echo '</ul>';
        }
    ?>

    マルチサイトなので同じ要領で「wp_posts」の部分を「wp_2_posts」と変更して別のサイトの投稿タイプ「post_type_name」を一括削除しようと思うのですが、「次の投稿をゴミ箱に移動しました。」と表示はされるもののデータ自体は削除できていません。
    理由もわからず、行き詰まっています。
    解決策、ヒント頂ければ幸いです。

    よろしくお願いいたします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • モデレーター jim912

    (@jim912)

    $query_result には、wp_2_posts のIDが格納されますが、

    wp_delete_post($id, $force_delete)

    では、現在のブログである、wp_posts に対して削除処理が走ります。(wp_posts から必要なデータが消えてしまっていないか確認が必要です)
    ID 2 のブログで削除処理を行うには、switch_to_blog にて、切り替えを行ってください。

    また、処理が終わった後は、restore_current_blog で変更したブログを戻しておくようにしましょう。

    トピック投稿者 igawan

    (@igawan)

    遅くなりまして申し訳ありません。

    ありがとうございます!

    使ったこと無いけどswitch_to_blog試してみます。

    トピック投稿者 igawan

    (@igawan)

    下記のようにしてみましたが、エラーが表示されてしまいます。
    使い方間違ってましたでしょうか?

    エラー内容
    Fatal error: Call to undefined function switch_to_blog() in /home/users/2/hoge.jp/web/wp/wpdb.php on line 1

    PHPの記述

    <?php switch_to_blog(2); //ブログIDが2の時 ?>
    <?php
    // WordPress関数を動くようにする
    require_once( dirname(__FILE__) . '/wp-load.php' );
    
        // wpdbでデータベースを直接検索しています。
        $query_text = "SELECT ID FROM wp_posts WHERE post_type = 'post_type_name'";
        $query_result = $wpdb->get_results($query_text);
    
        // 削除したリスト
        $delete_post_ids = "";
        // 削除に失敗したリスト
        $not_found_post_id = "";
        foreach($query_result as $item) {
            $id = $item->ID;
            if (wp_delete_post($id, $force_delete) === false) {
                $not_found_post_id .= "<li>$id</li>";
            } else {
                $delete_post_ids .= "<li>$id</li>";
            }
        }
    
        if (empty($delete_post_ids)) {
            echo "<p>対象の投稿が見つかりませんでした。</p>";
        } else {
            if ($force_delete === true) {
                echo "<p>次の投稿を削除しました。</p>";
            } else {
                echo "<p>次の投稿をゴミ箱に移動しました。</p>";
            }
            echo '<ul>';
            echo $delete_post_ids;
            echo '</ul>';
        }
    
        if (empty($not_found_post_id) === false) {
            if ($force_delete === true) {
                echo "<p>次の投稿を削除できませんでした。</p>";
            } else {
                echo "<p>次の投稿をゴミ箱に移動できませんでした。</p>";
            }
            echo '<ul>';
            echo $not_found_post_id;
            echo '</ul>';
        }
    ?>
    <?php restore_current_blog();  ?>

    モデレーター jim912

    (@jim912)

    switch_to_blog は、WordPress の関数ですので、

    // WordPress関数を動くようにする
    require_once( dirname(__FILE__) . '/wp-load.php' );

    より前に記述があると、関数が読み込まれておらずエラーとなります。

    また、wp_posts はテーブル接頭辞を含んだ名称になりますので、 $wpdb->posts とすると、テーブル接頭辞や対象ブログに関わらず、対象ブログの posts テーブルを指定することが可能です。

    トピック投稿者 igawan

    (@igawan)

    ありがとうございます。
    require_once~の下に移動させたらできました!
    初歩的なこともわかってなくて申し訳ありません。。。

    お手数おかけいたしました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「マルチサイトで特定の投稿タイプを一括削除する方法について」には新たに返信することはできません。