カスタム投稿タイプのすべての投稿を効率的に削除します


8

1つのカスタム投稿タイプの投稿をすべて削除する安全で迅速な方法を探しています。返された投稿ごとにget_posts()and wp_delete_post()を使用しても機能しません。膨大な量のデータベースクエリが含まれるため、十分な速度ではありません(タイムアウトエラー)。

できれば、カスタムの投稿タイプであるすべての投稿を削除する単一のデータベースクエリを探しています。何かご意見は?


これは1回限りのイベントですか?その場合、phpMyAdminを介した簡単なSQLクエリが最も簡単なようです。これがプログラム的に/繰り返し実行する必要があるハウスキーピング手順である場合、それはあなたを助けません。
jdm2112 2015年

残念ながら、手動でデータベースにアクセスすることなく、定期的に実行する必要があります。
Marcus McLean

了解。そのときはwpdbクラスを見ることをお勧めします。DBを直接操作するための推奨される方法と「WPの方法」。そのクエリについてサポートが必要な場合はお知らせください。必要に応じて後で完全な回答を投稿できますcodex.wordpress.org/Class_Reference/wpdb
jdm2112 '13

2
'fields' => 'ids',in get_postsを使用して投稿IDのみを取得します。これだけで
十分で

1
@MarcusMcLean:明らかに、あなたは私のポイントを逃しました;)単一の投稿は、postsテーブル、postmetaテーブル、taxonomyテーブル、そして場合によってはoptionsテーブルにデータを持っています。これらの投稿を削除するために記述する純粋なSQLクエリは非常に複雑になります。あなたはそれらの様々なテーブルに物事を置き去りにする良いチャンスに立っています。たとえば、Core関数を使用して5分間隔で一度に50個ずつ削除しますwp_cron()
s_ha_dum

回答:


17

すべての投稿を削除できます $wpdb

DELETE FROM wp_posts WHERE post_type='post_type';
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT id FROM wp_posts);
DELETE FROM wp_term_relationships WHERE object_id NOT IN (SELECT id FROM wp_posts)

または、このクエリを使用して、{{your CPT}}をカスタム投稿タイプに置き換えます

DELETE a,b,c
    FROM wp_posts a
    LEFT JOIN wp_term_relationships b
        ON (a.ID = b.object_id)
    LEFT JOIN wp_postmeta c
        ON (a.ID = c.post_id)
    WHERE a.post_type = '{{your CPT}}';

1
これはおそらく正常に機能しますが、用語テーブルの1つにある用語カウントを忘れないでください。WordPressにはこれを更新する機能が必要です。
Joel M

ユーザーの画面にも投稿数が表示されます。このデータが事前に保存されているか、ページの読み込み時に計算されているかは不明です。
Joel M

1
@JoelM count列はデータベーステーブルに存在しますwp_term_taxonomy。カウントを更新するために探している関数はwp_update_term_count($terms, $taxonomy, false)、でwp_update_term_count_now($terms, $taxonomy)定義されているようwp-includes/taxonomy.phpです。
Ken

2

さまざまな方法でカスタム投稿タイプのすべての投稿を削除できますが、ここでは、SQLクエリを使用せずにこれを行う方法を示します。ここでは、たとえば、投稿タイプは製品です

$allposts= get_posts( array('post_type'=>'product','numberposts'=>-1) );
foreach ($allposts as $eachpost) {
wp_delete_post( $eachpost->ID, true );
}

ここで完全なチュートリアルリファレンスを参照してください


「使い方:もう一度OPを読むget_posts()wp_delete_post()、各返却ポストのためのない仕事、それが原因(タイムアウトエラー)が関与データベースクエリの膨大な量に十分に速くはありません。」あなたは彼が使いたくない二つの機能を使っています。
Mike
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.