Làm cách nào để tôi xóa loại bỏ Unc Classified từ các bài đăng có nhiều hơn 1 danh mục?


9

Vì vậy, gần đây tôi đã chuyển một khách hàng từ Blogger sang Wordpress.

Khi các bài đăng được nhập từ blogger, nó đã lưu "nhãn" của blogger dưới dạng "thẻ" trong Wordpress. Vì tôi muốn có những thứ này làm danh mục thay thế, tôi đã sử dụng một plugin để chuyển đổi tất cả các thẻ thành danh mục.

Điều này hoạt động tốt và bảnh bao, nhưng nó không được phân loại trên tất cả các bài viết của tôi. Vì vậy, bây giờ tôi có khoảng 900 bài đăng mà tất cả đều có các danh mục chính xác được đính kèm, cũng như "Chưa được phân loại".

Vì vậy, mục tiêu của tôi là xóa "Chưa được phân loại" khỏi tất cả 900 bài đăng, nhưng tôi đang cố gắng tìm một phương pháp nhanh chóng để làm điều này.

Có ai biết làm thế nào tôi có thể thực hiện điều này trong một phương pháp số lượng lớn?


Làm thế nào để mã hiển thị các danh mục trông như thế nào?
SarahCoding

Không có mã, đây là trong quản trị viên.
Corey

Tôi nghĩ bạn chỉ cần xóa Uncategorizeddanh mục.
SarahCoding

1
@ Dan9, chúng tôi không thể xóa Uncategorizeddanh mục đó là danh mục bài đăng mặc định được gán cho các bài đăng khi không được phân công nhưng chúng tôi có thể mặc định này bằng cách truy cậpSettings-->Writing
bravokeyl

Bạn cần một danh mục theo mặc định trong WordPress. "Chưa được phân loại" là danh mục mặc định của WordPress. Những gì tôi muốn đề xuất, bạn có thể thay đổi danh mục mặc định từ "Chưa phân loại" thành một trong những danh mục của riêng bạn hoặc bạn có thể thay đổi tên của danh mục mặc định.
bagpipper

Câu trả lời:


8

Với wp-cli được cài đặt, bạn có thể chạy tập lệnh bash như thế này để xóa danh mục 'Chưa được phân loại' khỏi tất cả các bài đăng có nhiều hơn một danh mục

#!/bin/bash

for post in $(wp post list --field=ID)
do
  count=$(wp post term list $post 'category' --fields='name' --format="count")
  if [ "$count" -gt "1" ]
  then
    wp post term remove $post category 'uncategorized'
  fi
done

Lưu cái này như một cái gì đó giống như delete_uncategorized.bashvà sau đó chạy bash delete_uncategorized.bashtừ dòng lệnh.


wp cli là một cách tiếp cận tốt.
JMau

Điều này có yêu cầu quyền truy cập SSH vào máy chủ mà trang web được lưu trữ không? Tôi chỉ có quyền truy cập SFTP theo như tôi biết trên WP Engine. Tôi biết họ đã thử nghiệm WP CLI trong quá khứ nhưng không chắc chắn về tình trạng này.
Corey

Nhưng về cơ bản, tôi có thể chuyển đổi phương thức này thành tập lệnh PHP.
Corey

Bạn có thể có thể tải cơ sở dữ liệu về máy tính cục bộ của bạn và chạy tập lệnh trên đó.
Simon Cossar

4

Đây là một plugin khi kích hoạt, vòng lặp qua tất cả các bài đăng thuộc danh mục chưa được phân loại. Nếu nó thuộc loại khác, nó sẽ loại bỏ chưa được phân loại. Hơn nữa, khi một bài đăng được lưu, nó sẽ kiểm tra tương tự.

<?php
/**
 * Plugin Name: Remove Uncategorized
 * Description: Removes the uncategorized category if there's another category.
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 */

//* Don't access this file directly
defined( 'ABSPATH' ) or die();

register_activation_hook( __FILE__ , 'wpse_106269_activation' );

function wpse_106269_activation() {
  $args = array(
    'posts_per_page'   => -1,
    'offset'           =>  0,
    'category'         => get_option( 'default_category' ),
    'post_status'      => 'any',
    'suppress_filters' => true,
  );
  $posts = get_posts( $args );
  foreach( $posts as $post ) {
    wpse_106269_maybe_remove_uncategorized_category( $post->ID );
  }
}

add_action( 'save_post', 'wpse_106269_save_post', 10, 3 );

function wpse_106269_save_post( $id, $post, $update ) {
  remove_action( 'save_post', 'wpse_106269_save_post', 10, 3 );
  wpse_106269_maybe_remove_uncategorized_category( $id );
  add_action( 'save_post', 'wpse_106269_save_post', 10, 3 );
}

function wpse_106269_maybe_remove_uncategorized_category( $id ) {
  $categories = get_the_category( $id );
  $default = get_cat_name( get_option( 'default_category' ) );
  if( count( $categories ) >= 2 && in_category( $default, $id ) ) {
    wp_remove_object_terms( $id, $default, 'category' );
  }
}

2

Một chút muộn cho các bên tiệc tùng, nhưng tôi chỉ cần làm điều này bản thân mình. Một cách giải quyết khác là thông qua các truy vấn SQL trong phpmyadmin, đại loại như:

SELECT *
FROM `wp_term_relationships`
WHERE `term_taxonomy_id`
IN ( SELECT `term_taxonomy_id`
FROM `wp_term_taxonomy`
WHERE `taxonomy` = 'category' )
GROUP BY `object_id`
HAVING ( COUNT( `object_id` ) >1 )

(thay thế tiền tố wp_ bằng tiền tố của bạn) Thông thường " Chưa được phân loại" có term_taxonomy_id = 1. Truy vấn trên sẽ nhóm tất cả các id bài đăng có nhiều hơn một danh mục, do đó, tự nhiên "chưa được phân loại" được hiển thị đầu tiên trong nhóm. Vì vậy, chọn tất cả các hàng có term_taxonomy_id = 1 và xóa chúng. Và đó là về nó!

Bây giờ, tất cả những gì bạn phải làm là chỉnh sửa trường đếm "chưa được phân loại" ( term_taxonomy_id = 1) trong bảng wp_term_taxonomy . Số lượng là số lượng bài viết được liệt kê trong danh mục này, nhưng trường cụ thể không được cập nhật tự động.

Nếu bạn đi đến bảng quản trị wp, phần danh mục, số đếm cũ (sai) vẫn được hiển thị, nhưng nếu bạn nhấn số đó và đi đến danh sách bài đăng của 'Chưa được phân loại', wordpress thường kể lại các bài đăng được liên kết với điều đó thể loại. Một số đếm chính xác sẽ được hiển thị ở trên cùng bên phải của bạn, vì vậy hãy vào db của bạn và chỉnh sửa trường đếm phù hợp :)

Chỉnh sửa: Trên thực tế, số đếm cuối cùng sẽ được cập nhật, chỉ là không ngay lập tức, vì vậy bạn có thể muốn bỏ qua cập nhật đếm thủ công.


0

Dựa trên câu trả lời của @ TechSmurfy, tôi đã nghĩ ra điều này:

create temporary table tr_to_delete (object_id INT);
insert into tr_to_delete SELECT object_id FROM wp_term_relationships tr, wp_term_taxonomy tt WHERE tr.term_taxonomy_id=tt.term_taxonomy_id and tt.taxonomy='category' GROUP BY object_id HAVING COUNT(*) >1;
delete from wp_term_relationships where term_taxonomy_id=1 and object_id in (select object_id from tr_to_delete);
drop temporary table tr_to_delete;

0

Chà, cách dễ nhất mà không gây rối với cơ sở dữ liệu là tạo một danh mục mới, biến nó thành mặc định, sau đó đi vào danh sách bài đăng và sắp xếp theo danh mục 'chưa được phân loại'. Chỉnh sửa các bài đăng đó và xóa thẻ danh mục 'Chưa được phân loại.

Khi đã hoàn thành, bạn có thể xóa danh mục. Một thể loại không thể bị xóa nếu bất kỳ bài viết sử dụng thể loại đó.


0

Sau khi loay hoay và thử tất cả các cách tiếp cận từ phía trên, tôi thấy rằng truy vấn sql này là cách nhanh nhất để xóa bài đăng khỏi Uncool có nhiều hơn một con mèo.

Sử dụng WP-CLI sẽ là lựa chọn tốt nhất, nếu nó không chậm như địa ngục.

Trong trường hợp của tôi, tôi đã phải xóa hơn 50 000 mối quan hệ, vì vậy nó chỉ bị lỗi.

DELETE FROM wp_term_relationships WHERE term_taxonomy_id=1 AND object_id IN ( SELECT object_id  FROM (
SELECT tr.object_id FROM wp_term_relationships tr, wp_term_taxonomy tt WHERE tr.term_taxonomy_id=tt.term_taxonomy_id and tt.taxonomy='category' GROUP BY tr.object_id HAVING COUNT(*) >1
) as temp_table);
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.