Bagaimana cara menghapus "Tidak Dikategorikan" dari posting dengan lebih dari 1 kategori?

9

Jadi baru-baru ini saya memindahkan klien dari Blogger ke Wordpress.

Ketika posting diimpor dari blogger, itu menyimpan "label" blogger sebagai "tag" di Wordpress. Karena saya ingin menjadikan ini sebagai kategori, saya menggunakan plugin untuk mengonversi semua tag ke kategori.

Ini berfungsi dengan baik dan keren, tetapi membuat Uncategorized pada semua posting saya. Jadi sekarang saya memiliki sekitar 900 posting yang semuanya memiliki kategori yang benar terpasang, serta "Tidak Dikategorikan".

Jadi tujuan saya adalah menghapus "Tidak Dikategorikan" dari semua 900 posting, tetapi saya berjuang untuk menemukan metode cepat untuk melakukan ini.

Adakah yang tahu bagaimana saya bisa mencapai ini dalam metode massal?

Corey
sumber
Seperti apa bentuk kode yang menampilkan kategori?
SarahCoding
Tidak ada kode, ini ada di admin.
Corey
Saya pikir Anda hanya perlu menghapus Uncategorizedkategorinya.
SarahCoding
1
@ Dan9, kita tidak bisa hanya menghapus Uncategorizedkategori itu adalah kategori posting default yang ditetapkan untuk posting ketika tidak ada yang ditetapkan tetapi kita dapat default ini dengan pergi keSettings-->Writing
bravokeyl
Anda memerlukan kategori secara default di WordPress. "Uncategorized" adalah kategori default WordPress. Apa yang saya sarankan, Anda dapat mengubah kategori default dari "Tidak Dikategorikan" menjadi milik Anda sendiri, atau Anda dapat mengubah nama kategori default.
bagpipper

Jawaban:

8

Dengan wp-cli terinstal, Anda dapat menjalankan skrip bash seperti ini untuk menghapus kategori 'tidak dikategorikan' dari semua posting dengan lebih dari satu kategori

#!/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

Simpan ini sebagai sesuatu seperti delete_uncategorized.bashdan kemudian jalankan bash delete_uncategorized.bashdari baris perintah.

Simon Cossar
sumber
wp cli adalah pendekatan yang baik.
JMau
Apakah ini memerlukan akses SSH ke server tempat situs dihosting? Saya hanya memiliki akses SFTP sejauh yang saya tahu di WP Engine. Saya tahu mereka pengujian beta WP CLI di masa lalu tetapi tidak yakin statusnya.
Corey
Tapi pada dasarnya saya mungkin hanya bisa mengkonversi metode ini ke skrip PHP.
Corey
Anda mungkin dapat mengunduh database ke komputer lokal Anda dan menjalankan skrip di sana.
Simon Cossar
4

Berikut adalah plugin yang setelah aktivasi, loop melalui semua posting yang ada di kategori tidak dikategorikan. Jika itu dalam kategori lain, itu dihapus tanpa kategori. Lebih lanjut, ketika sebuah posting disimpan, ia melakukan pemeriksaan yang sama.

<?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' );
  }
}
Nathan Johnson
sumber
2

Agak terlambat ke pesta, tapi aku hanya perlu melakukan ini sendiri. Solusinya adalah melalui query SQL di phpmyadmin, sesuatu seperti:

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 )

(ganti awalan wp_ dengan awalan Anda) Biasanya "uncategorized" memiliki term_taxonomy_id = 1. Kueri di atas akan mengelompokkan semua id posting di mana ada lebih dari satu kategori, jadi tentu saja "uncategorized" ditampilkan terlebih dahulu dalam pengelompokan. Jadi pilih semua baris yang memiliki term_taxonomy_id = 1 dan hapus. Dan itu saja!

Sekarang yang harus Anda lakukan adalah mengedit bidang hitung "tanpa kategori " ( term_taxonomy_id = 1) di tabel wp_term_taxonomy . Nomor hitung adalah berapa banyak artikel yang terdaftar dalam kategori ini, tetapi bidang spesifik tidak diperbarui secara otomatis.

Jika Anda pergi ke panel admin wp Anda, bagian kategori, nomor hitungan yang lama (salah) masih ditampilkan, tetapi jika Anda menekan nomor itu dan pergi ke daftar posting 'tidak dikategorikan', wordpress biasanya menceritakan posting yang berafiliasi dengan itu kategori. Hitungan yang benar akan ditampilkan di kanan atas Anda, jadi pergilah ke db Anda, dan edit bidang hitung yang sesuai :)

Sunting: Sebenarnya, penghitungan akhirnya diperbarui, tidak segera, jadi Anda mungkin ingin melewatkan pembaruan penghitungan manual.

TechSmurfy
sumber
0

Berdasarkan jawaban @ TechSmurfy saya datang dengan ini:

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;
Jamie Chong
sumber
0

Nah, cara termudah tanpa mengacaukan basis data adalah membuat kategori baru, menjadikannya default, lalu masuk ke daftar posting dan mengurutkan berdasarkan kategori 'tidak dikategorikan'. Edit posting tersebut dan hapus tag kategori 'tidak dikategorikan'.

Setelah selesai, Anda dapat menghapus kategori. Kategori tidak dapat dihapus jika ada posting yang menggunakan kategori itu.

Rick Hellewell
sumber
0

Setelah mengacau dan mencoba semua pendekatan dari atas, saya menemukan bahwa kueri sql ini adalah cara tercepat untuk menghapus posting dari Uncategorized yang memiliki lebih dari satu kucing.

Menggunakan WP-CLI akan menjadi pilihan terbaik, jika tidak lambat sekali.

Dalam kasus saya, saya harus menghapus lebih dari 50.000 hubungan istilah, jadi itu hanya GAGAL.

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);
dulesaga
sumber