複数のカテゴリがある投稿から「未分類」を削除するにはどうすればよいですか?


9

そこで最近、クライアントをBloggerからWordpressに移動しました。

ブロガーから投稿をインポートすると、ブロガーの「ラベル」が「タグ」としてWordpressに保存されました。代わりにこれらをカテゴリとして使用したいので、プラグインを使用してすべてのタグをカテゴリに変換しました。

これは問題なくうまくいきましたが、私のすべての投稿に未分類のままになりました。現在、約900の投稿があり、すべてに正しいカテゴリが添付され、「未分類」となっています。

だから私の目標は900件の投稿すべてから「未分類」を削除することですが、これを行う迅速な方法を見つけるのに苦労しています。

誰かが私がこれを一括方法でどのように達成できるか知っていますか?


カテゴリを表示するコードはどのように見えますか?
SarahCoding

コードはありません、これは管理者にあります。
Corey

Uncategorizedカテゴリを削除する必要があるだけだと思います。
SarahCoding

1
@ Dan9、Uncategorizedカテゴリを削除することはできません。何も割り当てられていない場合、投稿に割り当てられているデフォルトの投稿カテゴリですが、次のようにしてデフォルトにすることができますSettings-->Writing
bravokeyl

WordPressではデフォルトでカテゴリが必要です。「未分類」は、WordPressのデフォルトのカテゴリです。私が提案したいのは、デフォルトのカテゴリを「未分類」から独自のカテゴリに変更するか、デフォルトのカテゴリの名前を変更することです。
バグピッパー2016

回答:


8

WP-CLIがインストールされますが、複数のカテゴリを持つすべての記事から「未分類」のカテゴリを削除するには、このようにbashスクリプトを実行することができます

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

これを次のように保存して、コマンドラインからdelete_uncategorized.bash実行bash delete_uncategorized.bashします。


wp cliは良いアプローチです。
JMau 2016

これには、サイトがホストされているサーバーへのSSHアクセスが必要ですか?私はWPエンジンで知る限り、SFTPアクセスしか持っていません。私は彼らが過去にWP CLIをベータテストしていたことを知っていますが、ステータスはわかりません。
Corey

しかし基本的には、おそらくこのメソッドをPHPスクリプトに変換するだけで済みます。
Corey

データベースをローカルコンピュータにダウンロードし、そこでスクリプトを実行することができます。
Simon Cossar

4

これは、アクティベーション時に、未分類のカテゴリにあるすべての投稿をループするプラグインです。別のカテゴリにある場合は、未分類を削除します。さらに、投稿が保存されると、同じチェックが行われます。

<?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

パーティーのメンバーには少し遅れましたが、私は自分でこれを行う必要がありました。回避策は、phpmyadminでSQLクエリを使用することです。

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 )

(wp_プレフィックスをプレフィックスに置き換えます)通常、「未分類」には、term_taxonomy_id = 1があります。上記のクエリは、複数のカテゴリがあるすべての投稿IDをグループ化するため、当然、「未分類」が最初に表示されます。したがって、term_taxonomy_id = 1の行をすべて選択して削除します。そしてそれはそれについてです!

これで、wp_term_taxonomyテーブルの "未分類"(term_taxonomy_id = 1)のカウントフィールドを編集するだけです。カウント数は、このカテゴリにリストされている記事の数ですが、特定のフィールドは自動的に更新されません。

wp管理パネルのカテゴリセクションに移動すると、古い(間違った)カウント番号が引き続き表示されますが、その番号を押して「未分類」の投稿リストに移動すると、通常、WordPressはそれに関連する投稿を再カウントしますカテゴリー。正しい数が右上に表示されるので、次にdbに移動し、それに応じてフィールドを編集します :)

編集:実際には、カウントはすぐには更新されませんが、最終的には更新されるため、手動によるカウントの更新をスキップすることをお勧めします。


0

@TechSmurfyの答えに基づいて私はこれを思いつきました:

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

まあ、データベースをいじることなく最も簡単な方法は、新しいカテゴリを作成し、それをデフォルトにしてから、投稿リストに移動して「未分類」カテゴリで並べ替えることです。それらの投稿を編集し、「未分類」のカテゴリタグを削除します。

それが完了したら、カテゴリを削除できます。投稿がそのカテゴリを使用している場合、そのカテゴリは削除できません。


0

上記のすべてのアプローチをいじって試してみたところ、このSQLクエリが、複数の猫を含むUncategorizedから投稿を削除する最も速い方法であることがわかりました。

WP-CLIを使用するのは、地獄のように遅くなければ、最良の選択肢です。

私の場合、50 000を超える用語の関係を削除する必要があったため、失敗しました。

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.