web-dev-qa-db-ja.com

プラグインphpからmySQLのwp_postsテーブルを編集するには?

Wp_postsテーブルにエントリを追加するプラグインを変更する必要があります。現在のところ、いくつかの(他の)プラグイン固有の列をターゲットにできないという点で欠けています。私は、プラグインを使ってこれらの列を変更できるように、プラグインを編集しようとしています。

このテーブルを一般的にターゲットとし、その後エントリを作成/編集するにはどうすればよいですか。

私はこの擬似コードのようなものを頭に入れています:

function editTable() {
    $table = getTable(wp_posts);
    $tableRow = table.row(1234);
    $tableRow.column(1234) = "new data entry";
}

私が変更しようとしているプラ​​グインがすでにwp_postsテーブルに変更を加えているので、これが可能であると思います。しかし、私は、私の疑似コードがずれる可能性があることを認識しています。どうやってこれをするの?

1
fredsbend

私が知っているwp_postsテーブルを編集するには2つの方法があります。 1つ目はwp_update_post()wp_insert_post()関数です。これらは一般的なWP関数で、他のものと同じように使用されます。正しいパラメータを渡すだけです。例えば:

$my_post = array(
      'ID'           => $updatePostID, // User defined variable; the post id you want to update.
      'post_title'   => 'Update Title',
      'post_content' => 'Update Content', 
  );
// Update the post into the database
$post_id = wp_update_post( $my_post, true ); // Returns 0 if no error; returns post id if there was an error.

// Check if table was updated without error. For debugging. Remove from your code if it all works, before publishing.
if (is_wp_error($post_id)) {
    $errors = $post_id->get_error_messages();
    foreach ($errors as $error) {
        echo $error;
    }
}

定義済みのフィールド名を含む配列を関数に渡すだけで、正しく実行されます。更新機能は当然更新用であり、挿入機能は新しいテーブルエントリ(行)を作成します。ただし、制限があります。これら2つの機能はWP定義済みフィールドでのみ機能します。そのため、テーブルにカスタムフィールドが含まれている場合は、$wpdbクラスを使用する必要があります。

あなたのmySQLテーブルをWordPressから更新するもう一つの方法は$wpdbクラスを直接使うことです。このクラスはwp_update_post()wp_insert_post()関数よりはるかに拡張的です。最初の違いは、wp_postsテーブルだけでなく、他の多くのmySQLテーブルを編集できることです。 WP以外のフィールドも編集できます。例えば:

global $wpdb; // This calls the use of the class. I actually do not think this is necessary, but I do it anyway.
$dbresult = $wpdb->update($wpdb->posts, // Returns 0 if no errors. Post ID if errors occurred. 
            // Notice posts instead of wp-posts. Prefixes are not necessary with this class.
     ['post_title' => 'Update Title', 
      'post_content' => 'Update Content', 
      'custom_field' => $customField, ], // User defined table column and variable.
     ['ID' => $updatePostID, ]); // User defined variable; the post id.
if (false === $dbresult) {
    echo 'An error occurred while updating...'; 
    $errors = $post_id->get_error_messages();
}

私はこれらのオプションのどちらにもあまり馴染みがありませんが、機能の幅に大きな違いがあるように思われるので、一方をもう一方よりも優先して使用する必要があるかもしれません。私はそのために質問をしました: wp_update_post()は$ wpdbクラスがしないことをどうしますか? 1 返信 は言う:

$wpdbの欠点は、SQLを知っている必要があること、そして通常のデータのサニタイズ、いつprepare()を使うべきか、そしてどんな関数がすでにステートメントを準備しているかということを意識する必要があることです。youalltheにアクセスできるため、$wpdbクラスは本来デフォルトのWordPress関数よりも強力です。データは、カスタムかどうかにかかわらず、取得、変更、または削除するための適切なSQLを知っていると想定しています。

TL; DR$wpdbはより強力ですが友好的ではなく、寛容です。

それは私には理にかなっています。基本的に、自分が何をしているのか、絶対にしなければならないことがわかっていない限り、$ wpdbをいじる必要はありません。

0
fredsbend