eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

SQL запрос удаления постов до определенного id

Нужно удалить wp_post + wp_postmeta записи которые меньше определенного id,
что-то на подобие (написал в шутку, проверил, работает):

DELETE FROM wp_posts WHERE ID < 253294;
DELETE FROM wp_postmeta WHERE meta_id < 256489;

если через вордпресс удаление

   /*** Удаляем пост вместе с файлами */
	add_action( 'before_delete_post', 'delete_all_attached_media' );

	function delete_all_attached_media( $post_id ) {
		if( get_post_type($post_id) == "post" ) {
			$attachments = get_attached_media( '', $post_id );

			foreach ($attachments as $attachment) {
			  wp_delete_attachment( $attachment->ID, 'true' );
			}
		}
	}
Заметки к вопросу:
anseme 3.9 лет назад

И зачем это? С удалением окуратно нужно, нужно конкретизировать что вы удаляете. Без контекста такой способ удаления оч странный...

А как быть с тем что вы удалите еще что то из базы что не надо было удалять?

Лучше хотя бы что бы было как то так:

(код не проверял, просто для примера)

DELETE FROM wp_posts WHERE ID IN (SELECT ID WHERE ID < 253294 AND post_type = 'post');
0
kolshix
4.2 года назад 779
  • 0
    Kama 9789

    В postmeta хранятся ID постов. Поэтому задача сводится к тому чтобы собрать ID постов и удалить их через PHP, чтобы отработали все сопутствующие хуки.

    global $wpdb;
    
    $args = (object) [
    	'max_post_id' => 3294,
    	'post_type' => 'post',
    ];
    
    $sql = "
    	SELECT DISTINCT post_id FROM $wpdb->postmeta LEFT JOIN $wpdb->posts ON (ID = post_id) 
    	WHERE ID < %d AND post_type = %s
    ";
    
    $post_ids = $wpdb->get_col( $wpdb->prepare( $sql, $args->max_post_id, $args->post_type ) );
    
    foreach( $post_ids as $post_id ){
    
    	$post = get_post( $post_id );
    	echo "$post->post_status - $post->post_title \n";
    
    	// wp_delete_post( $post_id, 'force' );
    }
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация