web-dev-qa-db-ja.com

メタボックスとドロップダウンでカスタム投稿を使用する

カスタム投稿を使用してMetaboxを追加するときに、ユーザーによって追加されたデータを取り込むドロップダウンメニューを追加する方法を疑問に思いました。

たとえば、ドロップダウンを使用して投稿の「ソース」を選択できるようにしたいのですが、その下で、ユーザーが同じドロップダウンにソースを追加できるようにしたいです。情報源に分類法を使用してそれらの分類法をドロップダウンに追加しようとすることによって、私は自分でこれをやってみましたが、おそらくそれは間違っていました。

私はこれについてどのように取り組むことができるかの任意のアイデア?

2
Mike

NOTE:それはちょっと遅いので、コードは完璧ではないかもしれませんが、正しい方向に進むはずです。

理論的には、カスタム分類法を設定するだけで、ユーザーは一番下のテキストボックスを使用してから分類法選択領域のチェックボックスを使用することができます。

私はあなたがこれらに標準のPost型を使っていると仮定します、しかしあなたはそれをregister_taxonomy呼び出しで調整することができます。

何かのようなもの:

register_taxonomy("post_source", array("post"), array("hierarchical" => true, "label" => "Sources", "singular_label" => "Source", "rewrite" => true));

ただし、ドロップダウンを設定している場合は、設定を少し変える必要があります。

以下のコードは、新しく追加されたソースをDBに送信するためにAjaxを使用し、それが成功したら、そのソースをドロップダウンに追加して自動的に選択します。

ステップ1:ソースを格納するためのテーブルを作成する

ユーザーが新しいソースを追加しようとしたときにそれらを参照し、それが既にデータベースに存在しないことを確認できるように、これらを格納するためのテーブルを作成します。

そして、ドロップダウンにそれらを引っ張ることができるようにあなたはどこかにそれらを保存する必要があります。

ステップ2:メタボックスを作成する

//run this function on admin_init
add_action('admin_init','add_post_source_box');
//add source selection box to post editor
function add_post_source_box() {
     add_meta_box("post_source_meta", "Post Source", "post_source", "post", "side", "high");
}

ステップ3:メタボックスに入力する

//populate the post_source box
function post_source() {
     global $post;
     $custom = get_post_custom($post->ID);
 $post_source = $custom['post_source'][0]; ?>

     <script type="text/javascript">
          jQuery(function() {
               jQuery("#post_source_add_button").click(function() {
                    var new_source = jQuery("$post_source_add").val();
                    var add_source = {"ajaxurl":"<?php echo get_bloginfo('wp_url'); ?>/wp-admin/admin-ajax.php"};
                    if(new_source.length) {
                         jQuery.post(
                              add_source.ajaxurl,
                              {
                                  action: 'add_source',
                                  source: new_source 
                              },
                              function(response,source_id) {
                                   if(response == 'success') {
                                        $("#post_source_dropdown").append('<option></option>').val(source_id).text(new_source);
                                        $("#post_source_dropdown").find('option').each(function() {
                                             if(jQuery(this).is('selected') {
                                                  jQuery(this).attr('selected','false');
                                             } else if(jQuery(this).attr('id') == source_id) {
                                                  jQuery(this).attr('selected','true');
                                             }
                                        });
                                   } else {
                                        alert('Error adding source.');
                                   }
                              }
                         );
                    }
               });
          });
     </script>

     <table cellpadding="0" cellspacing="5" border="0">
          <tr>
               <td><label for="post_source_dropdown">Post Source</label></td>
          </tr>
          <tr>
               <td>
                   <select name="post_source_dropdown" id="post_source_dropdown">
                        <option value="">Select a Source</option>

                        <?php //get the various sources already added
                        $global wpdb;
                        $sources = $wpdb->get_results("SELECT * FROM wp_post_sources ORDER BY source_name");
                        foreach($sources as $source) {
                             if($source->id == $post_source) {
                                  $selected = ' selected';
                             } else {
                                  $selected = '';
                             }
                             echo '<option value="' . $source->id . '"' . $selected . '>' . $source->source_name . '</option>';
                        } ?>
               </td>
          </tr>
          <tr>
               <td><label for="post_source_add">Add New Source</label></td>
          </tr>
          <tr>
               <td>
                    <input type="text" name="post_source_add" id="post_source_add" value="" />
                    <br />
                    <input type="button" id="post_source_add_button" name="post_source_add_button" value="Add Source" />
               </td>
          </tr>
     </table>

<?php }

ステップ4:カスタムメタを保存する

//run this function when saving posts
add_action('save_post','save_post_source');
//save the source when the user saves the post
function save_post_source() {
     $global post;

     update_post_meta($post->ID,'post_source',$_POST['post_source_dropdown']);
}

この例のために直接書いた admin_enque_scripts アクションを使用して、JavaScriptを別のJSファイルに含めることをお勧めします。

この記事 はプラグインでAjaxを使用することの大きな内訳を示しています。これを関数に落とすのではなく、これを有効にすることをお勧めします。 php。そうすれば、もしテーマを交換したいのであれば、古いテーマのfunctions.phpから物を動かすことを忘れないでください。

ステップ5:Ajaxで新しいソースを処理する

遅れるので、私は今すぐあなたにこの1つを任せるつもりです、そして、ここでこれらすべてを得ることは私が予想したより長くかかりました。応答とデータベースに追加されたソースのIDを必ず送り返してください。

編集:私は本当に重要な部分を忘れました、それは私がリンクしたその記事で概説されています、しかしそれは本当に全体のAjax提出物事のリンチピンであるので再び注意されるべきです。

//run this function when admin-ajax receives the action 'add_source'
add_action('wp_ajax_add_source','add_source_to_db');
//add the new source to the db
function add_source_to_db() {
     //get the source from the $_POST array and then add it to the db
     //create the response object to send back to the JS function
}

これで、add_source_to_db関数に入力するだけですべて完了です。

HINT:グローバルな$ wpdbオブジェクトを使って新しいソースを挿入し、それから$ wpdb-> insert_idを使ってそのソースのIDを取得します。挿入しました。

うまくいけば、私が提供したものがあなたを始めることができるでしょう。

あなたが処理ファイルの助けを必要とするならば、私に知らせてくださいそして私はいくつかのコードを提供しようとします。しかし、プラグイン内のAjaxに関するリンクには、機能させるために必要なものがすべて含まれているはずです。

1
Eric Allen