• 解決済 sam20122012

    (@sam20122012)


    はじめまして。
    WordPress初心者です。

    カスタムフィールド(プラグイン未使用)を使ってテーブルを作成しております。
    フィールド内に複数の名前と値を入れて一度公開して閉じ、再度編集画面を開くと入力した順ではなく、名前順に変更されています。
    これを入力した順に表示することは可能でしょうか?

    それぞれに「meta-○○」といったidが振られているので、jQueryなどを使って無理やり変更することは可能なのですが、WordPress自体で変更できる方法があれば教えていただければと思います。

    よろしくお願いいたします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • カスタムフィールドは、[wp-admin/includes/post.php]のhas_meta()でデータベースから取得しています。
    順番もこの関数で指定しています。

    return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, post_id
    			FROM $wpdb->postmeta WHERE post_id = %d
    			ORDER BY meta_key,meta_id", $postid), ARRAY_A );

    ORDER BYでmeta_keyが優先されていますが、次のようにmeta_idを優先するように変更すれば、投稿編集画面で追加した順番で表示されるようになります。

    return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, post_id
    			FROM $wpdb->postmeta WHERE post_id = %d
    			ORDER BY meta_id,meta_key", $postid), ARRAY_A );

    has_meta()を次のように変更すると他の部分への影響を少なくする事が出来ます。
    他でカスタムフィールドを取得する箇所がある場合は、そちらでは通常通りmeta_keyが優先されます。

    function has_meta( $postid, $key = 'meta_key' ) {
    	global $wpdb;
    
    	if ($key == 'meta_id') {
    		return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, post_id
    				FROM $wpdb->postmeta WHERE post_id = %d
    				ORDER BY meta_id,meta_key", $postid), ARRAY_A );
    	} else {
    		return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, post_id
    				FROM $wpdb->postmeta WHERE post_id = %d
    				ORDER BY meta_key,meta_id", $postid), ARRAY_A );
    	}
    }

    投稿編集画面での呼び出し側は、[wp-admin/includes/meta-boxes.php]のpost_custom_meta_box()になります。

    $metadata = has_meta($post->ID);

    上記を次のように変更するだけで大丈夫です。

    $metadata = has_meta($post->ID, 'meta_id');

    オーバーライドできませんので、wordpress本体の方を変更することになります。
    バージョンアップ時に気をつけてください。
    ファイルを上書きしないわけにはいきませんので、その都度今回変更する箇所を再度変更するのが確実だと思います。

    トピック投稿者 sam20122012

    (@sam20122012)

    ありがとうございます!
    無事解決いたしました。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「カスタムフィールドの管理画面での見え方について」には新たに返信することはできません。