web-dev-qa-db-ja.com

MYSQLからWordPress $ WPDBへの変換

古いWordpressサイトを3.7からアップグレードしています。それはあなたが今$ WPDBを介してDBに接続しなければならない3.9以降では機能しないいくつかのSQLクエリ要求を持っています( https://codex.wordpress.org/Class_Reference/wpdb )。私は最初の段階でそれを取りましたが、mysql_fetch_arrayの部分にハングアップしました、そしてまた私がすでにしたことが正しいかどうかも不明です。 mysql_fetch_arrayがget_results( https://developer.wordpress.org/reference/classes/wpdb/get_results/ )を使用する必要があるようです。

私はこれがこれに近づくための理想的な方法ではなく、すべてを近代化することを完全に意図していることを十分に認識していますが、長い話を短くしておけば可能です。 。

添付されているのは元のコードで、次に私の試み(v2の試みも追加されました)です。ご覧いただきありがとうございます。

SQL:

$sql = "SELECT wp_acf_values.value FROM wp_acf_values, wp_acf_fields WHERE wp_acf_fields.post_id = '620' AND wp_acf_fields.id = wp_acf_values.field_id ORDER BY wp_acf_fields.order_no"; 
$result = mysql_query($sql) or die('Content was not loaded. Please refresh your page.'); 
$counter = 0; 
while($post = mysql_fetch_array($result)) { 

    $sqlSecond = "SELECT meta_value FROM wp_postmeta WHERE meta_id = '".$post['value']."'"; 
    $result1 = mysql_query($sqlSecond) or die('Content was not loaded.'); 
    while($post1 = mysql_fetch_array($result1)) { 
        $data[$counter] = $post1['meta_value']; 
        $counter++; 
    } 

} 

// get image 
$sql = "SELECT meta_value FROM wp_postmeta WHERE post_id = '".$data['1']."' AND meta_key = '_wp_attached_file'"; 
$result = mysql_query($sql) or die('Content was not loaded.'); 
$counter = 0; 
while($post = mysql_fetch_array($result)) { 
    $imgURL = $post['meta_value']; 
} 

WPDB v1:

global $wpdb;

$sql = $wpdb->prepare( "SELECT wp_acf_values.value FROM wp_acf_values, wp_acf_fields WHERE wp_acf_fields.post_id = '620' AND wp_acf_fields.id = wp_acf_values.field_id ORDER BY wp_acf_fields.order_no" );
$result = $wpdb->query ( $sql ) or die('Content was not loaded.');
$counter = 0;
while($post = mysql_fetch_array($result)) {

    $sqlSecond = $wpdb->prepare( "SELECT meta_value FROM wp_postmeta WHERE meta_id = %s", $post['value'] );
    $result1 = $wpdb->query ( $sqlSecond ) or die('Content was not loaded.');
    while($post1 = mysql_fetch_array($result1)) {
          $data[$counter] = $post1['meta_value'];
          $counter++;
    }

}

// get image
$sql = $wpdb->prepare( "SELECT meta_value FROM wp_postmeta WHERE post_id = %s AND meta_key = '_wp_attached_file'", $data['1'] );
$result = $wpdb->query ( $sql ) or die('Content was not loaded.');
$counter = 0;
while($post = mysql_fetch_array($result)) {
    $imgURL = $post['meta_value'];
}

WPDB v2:

global $wpdb;

$sql = $wpdb->prepare( "SELECT wp_acf_values.value FROM wp_acf_values, wp_acf_fields WHERE wp_acf_fields.post_id = '620' AND wp_acf_fields.id = wp_acf_values.field_id ORDER BY wp_acf_fields.order_no" );
$result = $wpdb->get_results ( $sql ) or die('Content was not loaded.');
$counter = 0;
foreach ($result as $post ) {
  $sqlSecond = $wpdb->prepare( "SELECT meta_value FROM wp_postmeta WHERE meta_id = %s", $post->value );
  $result1 = $wpdb->get_results ( $sqlTitle ) or die('Content was not loaded.');
  foreach ( $result1 as $post1 ) {
     $data[$counter] = $post1->meta_value;
     $counter++;
  }
}

// get image
$sql = $wpdb->prepare( "SELECT meta_value FROM wp_postmeta WHERE post_id = %s AND meta_key = '_wp_attached_file'", $data['1'] );
$result = $wpdb->get_results ( $sql ) or die('Content was not loaded.');
$counter = 0;
foreach ( $result as $post ) {
  $imgURL = $post->meta_value;
  $counter++;
}
1
chef_3072485

ここでの根本的な問題は、WordPressがmysql関数とmysqlオブジェクトを扱うこと、そしてこれらの関数の知識が役に立つという仮定です。

実のところ、これはそれ自体が完全なAPIなので、mysql_関数に関する知識が提供するという仮定は、SQLの構文を超えては有用ではなく、関連性もありません。

例えば:

$result = $wpdb->query ( $sql ) or die('Content was not loaded.');
$counter = 0;
while($post = mysql_fetch_array($result)) {

ここでの仮定は、$wpdb->queryが結果オブジェクトを返すということですが、そうではありません。

ドキュメントの例を見て、queryが実際に何を返すかを見ると、次のことがわかります。

この関数は、影響を受ける/選択された行数を示す整数値を返します。

そしてそれ:

MySQLエラーが発生した場合、関数はFALSEを返します。行の問合せでは0とFALSEの両方が返される可能性があるため、戻り値を確認するときは注意が必要です。

では、どうすれば行をフェッチできますか?

get_resultsを使う:

$myrows = $wpdb->get_results( "SELECT id, name FROM mytable" );

インジェクション攻撃を防ぐために、最初に$wpdb->prepareを通じてSQLステートメントを実行することを忘れないでください。

あなたが特異な値、行、または列を取得することを可能にする他の方法があります、しかしここで$myrowsは文字通り選択された行を持つ配列(またはエラー応答)です。戻り値の型を決定するget_resultsへの2番目のパラメータがあります。連想配列、キーを持つオブジェクトなど

https://codex.wordpress.org/Class_Reference/wpdb#SELECT_Generic_Results

あなたの2番目と3番目の質問の問題

これらのクエリを修正しても、それらはより速く、ささいな置き換えがあるので、基本的に悪い習慣です:

$value = get_post_meta( $post_id, 'key' );

$valueに、メタキーkeyを持つその投稿のすべてのメタ値が含まれるようになりました。

WP_Queryを使ってメタキーと値を使って投稿を取得することもできます(ただし、注意してください。これは、APIを使うか、直接SQLを使うよりもパフォーマンスの面で重要な罪です)

最初に直接SQLクエリを置き換えることができるACF関数またはAPIがおそらくあります。直接SQLクエリを実行する必要があることは非常にまれです。私の日々の仕事では、何十億ものページビューを扱う主要なWebサイトのコードと、何百万行ものコードを見直しました。そのうち、直接SQLクエリに遭遇したのはごくわずかです

2
Tom J Nowell