サポート » 使い方全般 » カスタムフィールドで、記事一覧をプルダウンにしたいのですが・・・

  • 解決済 yoh

    (@yoh)


    お世話になります。

    色々と思考錯誤してみたのですが、どうしても方法が
    わからなかったので質問させていただきます。

    現在、「施設情報」と「採用情報」という
    2つのカスタム投稿タイプを作成し、
    それぞれカスタムフィールドをfunctions.phpで生成しています。

    それぞれ、
    施設情報は[service]
    採用情報は[recruitment]としております。

    やりたいことは、
    「採用情報」の投稿画面に
    「施設情報」の記事一覧を取得し、それをプルダウンにして
    選択できるようにしたいのです。

    function.phpに以下のようなソースを書きましたが、
    一部のカスタムフィールドを記録してくれません。

    add_action('admin_menu', 'rec_service');
    add_action('save_post', 'save_rec_service');
    
    function rec_service() {
      add_meta_box('rec_service_area', '募集対象施設・サービス', 'rec_service_wrap', 'recruitment', 'advanced' );
    }
    
    // 募集対象施設・サービス 入力フィールド
    function rec_service_wrap() {
      global $post;
    
      echo '<input type="hidden" name="rec_service_field" id="rec_service_field" value="' .wp_create_nonce( plugin_basename(__FILE__) ) . '" />';
    
      $rec_service_select = get_post_meta($post->ID,'rec_service_select',true);
      echo '<p>';
      echo '<label for="rec_service_select">募集対象施設・サービス</label><br />';
      echo '<select name="rec_service_select" id="rec_service_select">';
      echo '<option value="">選択してください</option>';
      $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
      $wp_query = new WP_Query( array( 'post_type' => 'service', 'posts_per_page' => 500, 'paged' => $paged ) );
      while ( $wp_query->have_posts() ) : $wp_query->the_post();
      echo '<option value="';
      echo $wp_query->post->ID;
      echo'"';
      if($rec_service_select == $wp_query->post->ID ){ echo ' selected="selected"';  }
      echo '>';
      echo the_title();
      echo '</option>';
      endwhile; wp_reset_query();
      echo '</select>';
    
      echo '<input type="hidden" name="rec_service_place1" id="rec_service_place1" value="'.get_post_meta($rec_service_select,'service_place1',true).'">';
      echo '<input type="hidden" name="rec_service_place2" id="rec_service_place2" value="'.get_post_meta($rec_service_select,'service_place2',true).'">';
      echo '<input type="hidden" name="rec_service_place3" id="rec_service_place3" value="'.get_post_meta($rec_service_select,'service_place3',true).'">';
      echo '</p>';
    }
    
    function save_rec_service ( $post_id ) {
      if ( !wp_verify_nonce( $_POST['rec_service_field'], plugin_basename(__FILE__) )) {
        return $post_id;
      }
    
    if ( 'page' == $_POST['post_type'] ) {
      if ( !current_user_can( 'edit_page', $post_id )) return $post_id;
    } else {
      if ( !current_user_can( 'edit_post', $post_id )) return $post_id;
    }
    
    // 募集対象施設・サービス
      $rec_service_select = ($_POST['rec_service_select']);
      if( strcmp($rec_service_select,get_post_meta($post_id, 'rec_service_select', true)) != 0 )
        update_post_meta($post_id, 'rec_service_select', $rec_service_select);
      elseif($rec_service_select=="")
        delete_post_meta($post_id, 'rec_service_select',get_post_meta($post_id,'rec_service_select',true));
    
      $rec_service_place1 = ($_POST['rec_service_place1']);
      if( strcmp($rec_service_place1,get_post_meta($post_id, 'rec_service_place1', true)) != 0 )
        update_post_meta($post_id, 'rec_service_place1', $rec_service_place1);
      elseif($rec_service_place1=="")
        delete_post_meta($post_id, 'rec_service_place1',get_post_meta($post_id,'rec_service_place1',true));
    
      $rec_service_place2 = ($_POST['rec_service_place2']);
      if( strcmp($rec_service_place2,get_post_meta($post_id, 'rec_service_place2', true)) != 0 )
        update_post_meta($post_id, 'rec_service_place2', $rec_service_place2);
      elseif($rec_service_place2=="")
        delete_post_meta($post_id, 'rec_service_place2',get_post_meta($post_id,'rec_service_place2',true));
    
      $rec_service_place3 = ($_POST['rec_service_place3']);
      if( strcmp($rec_service_place3,get_post_meta($post_id, 'rec_service_place3', true)) != 0 )
        update_post_meta($post_id, 'rec_service_place3', $rec_service_place3);
      elseif($rec_service_place3=="")
        delete_post_meta($post_id, 'rec_service_place3',get_post_meta($post_id,'rec_service_place3',true));
    }

    記録されないのは、rec_service_place1、rec_service_place12、
    rec_service_place3です。

    ためしにrec_service_selectのプルダウン部分を丸ごと削除してみたところ、
    正常に記録されたので、おそらくループの仕方が悪いのだと思いますが、
    どのように取得するのがよいのかがわかりません。

    お手数おかけいたしますが、ご教授いただけませんでしょうか。
    よろしくお願いいたします。

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • トピック投稿者 yoh

    (@yoh)

    自己解決いたしました。
    $wpdbを使用してDBがら直接データを取得し、
    foreachでループすることで他のカスタムフィールドも
    きちんと記録できるようになりました。

    global $wpdb;
    $rec_service_select = get_post_meta($post->ID,’rec_service_select’,true);

    echo ‘<select name=”rec_service_select” id=”rec_service_select”>’;
    echo ‘<option value=””>選択してください</option>’;
    $service_list = $wpdb->get_results(“SELECT ID, post_title FROM $wpdb->posts WHERE post_type = ‘service'”);
    foreach ($service_list as $service_lists) {
    $svc_title = $service_lists->post_title;
    $svc_id = $service_lists->ID;
    echo ‘<option value=”‘.$svc_id.'”‘;
    if($rec_service_select == $svc_id ) echo ‘ selected=”selected”‘;
    echo ‘>’.$svc_title.'</option>’;
    }
    echo ‘</select>’;

1件の返信を表示中 - 1 - 1件目 (全1件中)
  • トピック「カスタムフィールドで、記事一覧をプルダウンにしたいのですが・・・」には新たに返信することはできません。