Xóa tất cả các bài đăng của một loại bài đăng tùy chỉnh hiệu quả


8

Tôi đang tìm kiếm một cách an toàn và nhanh chóng để xóa tất cả các bài đăng của loại bài đăng tùy chỉnh. Sử dụng get_posts()wp_delete_post()cho mỗi bài trả lại không hoạt động; nó không đủ nhanh do số lượng truy vấn cơ sở dữ liệu liên quan (lỗi hết thời gian).

Tốt hơn là, tôi đang tìm kiếm một truy vấn cơ sở dữ liệu duy nhất để chạy mà xóa tất cả các bài đăng thuộc loại bài đăng tùy chỉnh. Có suy nghĩ gì không?


Đây có phải là một sự kiện một lần? Nếu vậy, truy vấn sql nhanh qua phpMyAdmin có vẻ dễ nhất. Nếu đây là bước giữ nhà cần được thực hiện theo chương trình / lặp đi lặp lại, điều đó sẽ không giúp bạn.
jdm2112

Nó cần phải được thực hiện thường xuyên, không có quyền truy cập cơ sở dữ liệu thủ công, không may.
Marcus McLean

Roger đó. Tôi sẽ khuyên bạn nên nhìn vào wpdblớp sau đó. Phương pháp ưa thích và "cách WP" để làm việc trực tiếp với DB. Hãy cho chúng tôi biết nếu bạn cần giúp đỡ với truy vấn đó. Tôi có thể đăng câu trả lời đầy đủ sau nếu cần codex.wordpress.org/Class_Reference/wpdb
jdm2112

2
Sử dụng 'fields' => 'ids',trong get_postsđể có được chỉ ID bài. Đây là tất cả những gì bạn cần và nó sẽ tăng tốc đáng kể truy vấn của bạn
Pieter Goosen

1
@MarcusMcLean: rõ ràng, bạn đã bỏ lỡ quan điểm của tôi;) Một bài đăng duy nhất có dữ liệu trong bảng bài viết, bảng postmeta, bảng phân loại và có thể cả bảng tùy chọn. Bất kỳ truy vấn SQL thuần túy nào bạn viết để xóa các bài đăng đó sẽ khá phức tạp. Bạn có cơ hội tốt để lại những thứ phía sau trong những bảng khác nhau. Tôi sẽ thử xóa, giả sử, 50 tại một thời điểm trong khoảng thời gian 5 phút bằng cách sử dụng các chức năng Core vàwp_cron()
s_ha_dum

Câu trả lời:


17

Bạn có thể xóa tất cả bài viết qua $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)

hoặc sử dụng truy vấn này thay thế nó bằng {{CPT}} của bạn với Loại bài đăng tùy chỉnh của bạn

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
điều này có thể sẽ hoạt động tốt, nhưng đừng quên số lượng thuật ngữ trong một trong các bảng thuật ngữ. WordPress nên có một chức năng để cập nhật điều này.
Joel M

Người dùng cũng có số lượng bài đăng trên màn hình người dùng, không chắc dữ liệu này được lưu trước hay được tính khi tải trang.
Joel M

1
@JoelM Cột đếm tồn tại trong bảng cơ sở dữ liệu wp_term_taxonomy. Có vẻ như chức năng bạn đang tìm kiếm để cập nhật số lượng được xác định wp_update_term_count($terms, $taxonomy, false)hoặc wp_update_term_count_now($terms, $taxonomy)được xác định trong wp-includes/taxonomy.php.
Ken

2

Bạn có thể xóa tất cả các bài đăng của một loại bài đăng tùy chỉnh theo nhiều phương pháp khác nhau nhưng ở đây tôi sẽ chỉ cho bạn cách làm điều này mà không cần sử dụng truy vấn SQL. Ở đây, ví dụ, loại bài đăng của chúng tôi là sản phẩm

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

Xem hướng dẫn đầy đủ Tham khảo tại đây


Đọc lại OP: "Sử dụng get_posts()wp_delete_post()cho mỗi bài đăng được trả lại không hoạt động; nó không đủ nhanh do số lượng truy vấn cơ sở dữ liệu liên quan (lỗi hết thời gian)." Bạn đang sử dụng hai chức năng anh ấy không muốn sử dụng.
Mike
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.