0

プラグインを作成していて、foreach ループ内の wp_term_relationships テーブルに新しい行を挿入しようとしています。var_dump のために変数に値があることはわかっていますが、何らかの理由で一貫してエラーが発生します。これは show_errors() 関数で約 600 回表示されます。

WordPress データベース エラー: [キー 1 のエントリ '0-0' が重複しています] INSERT INTO wp_term_relationships ( object_id, term_taxonomy_id, term_order) VALUES ('','','')

私のコード:

foreach ($cb_t2c_cat_check as $values) {
        global $wpdb;
        $prefix = $wpdb->prefix;

        $table = $prefix . 'term_relationships';
        $object_id = $values->object_id;
        $taxo_id = $values->term_taxonomy_id;
        $num_object_id = (int)$object_id;
        $num_taxo_id = (int)$taxo_id;

        //var_dump($num_object_id); //This produces values, so why are they not getting inserted into the table?
        //var_dump($num_taxo_id); //This produces values, so why are they not getting inserted into the table?

        $wpdb->insert( 
            $table, 
            array( 
                'object_id' => $num_object_id, 
                'term_taxonomy_id' => $num_taxo_id,
                'term_order' => 0
                ), '' 
            ); 

        //$wpdb->show_errors();
        //$wpdb->print_error();
        }
4

2 に答える 2

1

なぜ動作しないのか:の3番目のパラメータ$wpdb->insertを空の文字列に設定しないでください。それに応じてすべてのフィールドをフォーマットします。

現在の機能は次のとおりです。

$wpdb->insert($table, array(
            'object_id' => sprintf('', $num_object_id), 
            'term_taxonomy_id' => sprintf('', $num_taxo_id),
            'term_order' => sprintf('', 0)
));

本当に3番目のパラメータを設定したい場合は、次のようにする必要があります。

$wpdb->insert($table, array(
            'object_id' => $num_object_id, 
            'term_taxonomy_id' => $num_taxo_id,
            'term_order' => 0
), array('%d', '%d', '%d'));

エラーについて:wp_term_relationshipsテーブルには(object_id、term_taxonomy_id)に一意の主キーがあります。これは、同じobject_idとterm_taxonomy_idの両方を持つ2つの行をそのテーブルに含めることができないことを意味します。

これは、insertの3番目のパラメーターを空の文字列に設定することにより、object_id=0およびterm_taxonomy_id=0の行を何度も挿入しようとしているために発生しました。

于 2012-02-24T11:39:21.810 に答える
0

データベースには一意のキーが必要であり、キーと値のペアが既に存在する行を挿入することはできず、新しい各値の形式を設定する必要があるという点で、上記の答えは正しかったです。さらに、Wordpress に固有の、特に term_taxonomy テーブルを処理してカウントを更新するという、私が対処していない問題がありました。

まず、プラグインは term_relationships テーブルの投稿の特定のカテゴリを更新するように設計されていることに注意することが重要です。これは、実際には $wpdb-> insert メソッドを使用して実現されました。ただし、プラグインが実際に term_relationships テーブルに新しい行を挿入したかどうかを判断するためのテストは、テーブルを直接見るのではなく、Wordpress ダッシュボードに移動してカテゴリを選択し、そのカテゴリの投稿数が前。プラグインが term_taxonomy テーブルのカウントを更新しなかったため、これは機能しませんでした。これを発見したのは、Wordpress ダッシュボードのカテゴリの横にある [表示] をクリックして、そのカテゴリの投稿が複数あることを確認したときだけでした。

term_taxonomy テーブルの 'count' 列も同様に更新する必要があることを確認しました。これには、データベースに直接アクセスし、ステートメントに WHERE = 'term_taxonomy_id' を入力します。案の定、1700 を超える結果がありましたが、Wordpress は何もないと思っていました。

レッスン: $wpdb->insert メソッドが動作していることを確認するには、PHPMyAdmin を使用します。必ずしも Wordpress ダッシュボードに依存する必要はありません。

いくつかの変更により、コードがうまく機能するようになりました。次に例を示します。

foreach ($cb_t2c_objects as $values) {
        global $wpdb;
        $prefix = $wpdb->prefix;

        $table = $prefix . 'term_relationships';
        $object_id = $values->object_id;
        $taxo_id = $values->cat_taxo;
        $num_object_id = (int)$object_id;
        $num_taxo_id = (int)$taxo_id;

        //Need to check to see if row exists for each, if not, then insert.
        $cb_t2c_get_row = $wpdb->get_row("
            SELECT * 
            FROM ".$prefix."term_relationships
            WHERE object_id = ".$num_object_id." AND term_taxonomy_id = ".$num_taxo_id."
            GROUP BY object_id, term_taxonomy_id
        ", OBJECT);

        //var_dump($cb_t2c_get_row);

        if ( is_null($cb_t2c_get_row) ) {
            //Insert the new values.
            $wpdb->insert( 
            $table, 
            array( 
                'object_id' => $num_object_id, 
                'term_taxonomy_id' => $num_taxo_id,
                'term_order' => 0
                ), 
            array(
                '%d', 
                '%d', 
                '%d'
                ) 
            );
        }

        //Set the variables for the count update.
        $cb_t2c_term_taxonomy_table = $prefix . 'term_taxonomy';
        $cb_t2c_update_data = $wpdb->get_var("
            SELECT count(term_taxonomy_id) as 'new_count'
            FROM ".$prefix."term_relationships
            WHERE term_taxonomy_id = ".$num_taxo_id."
        ",0,0); //returning NULL

        //var_dump($cb_t2c_update_data);

        //Update the count in the term_taxonomy table.
        $wpdb->query("
            UPDATE ".$prefix."term_taxonomy
            SET count = ".$cb_t2c_update_data."
            WHERE term_taxonomy_id = ".$num_taxo_id."
        ");
于 2012-02-27T00:37:24.367 に答える