web-dev-qa-db-ja.com

カスタム投稿タイプを別のテーブルに保存する

カスタム投稿タイプの投稿データをwp_postsやwp_postmetaではなく、カスタムテーブルに保存する必要があります。出来ますか?誰でも助けてください。実際には、 "truck"と "drivers"という名前のカスタム投稿タイプを2つ作成しました。それから私はwordpressの管理者にメニューページを作成しました。このメニューをクリックすると、トラックに関連するすべてのドライバが一覧表示されます。私はどんな運転手にどんなトラックでも割り当てることができるようにこのインタフェースのドラッグアンドドロップシステムもあるべきです。ソート後、テーブルを更新する必要があります。だから私はカスタム投稿タイプのための新しいテーブルが必要です。 see my screenshot

2
Arshad Hussain

私は可能な限りワードプレスを微調整することが大好きですが、今後の最善の方法はコーディング前に最善のアルゴリズムを使用することです。

あなたの質問を読んで、私は "Actually, I have created two custom post type named 'truck' and 'drivers'"に出会いました。

問題: 2つの投稿タイプをリンクするには、Wordpressの機能ではないため、作業中に余分な作業が必要になります。

推奨される解決策: _ WPが自然に機能するようにしてください:Link a Custom Post Type to a taxonomy。そのため、CPTとして「トラック」と「ドライバー」を使用する代わりに、CPTとして「ドライバー」と分類法として「トラック」を使用します。これにより、作業量が大幅に削減され、特に問題が発生した場合のリスクがWP更新されます。

その後、CPTと分類法へのドラッグアンドドロップのカスタム機能を作成できます。

3
Janvier

特定のコードを提供するつもりはありませんが、カスタムデータベーステーブルを作成せずにコードを作成する方法についてアイデアを示します。 トラックごとに1人の運転手 を想定しています

アルゴリズム

  1. 2つのHTMLリストを作成し、それらをソート可能にします。
  2. 各リストアイテムは投稿の種類を表し、IDデータフィールドを持ちます。
  3. ソートが完了したら、すべてのIDを順番に取得します。 2つの配列にトラックIDと別のドライバーIDが含まれるようにします。
  4. Ajaxで送ってください。
  5. 次のように、配列更新の投稿の投稿の親フィールドをループします。

       $truck[0]->post_parent = $driver[0]
       $driver[0]->post_parent = $truck[0];
    
    
       $truck[1]->post_parent = $driver[1]
       $driver[1]->post_parent = $truck[1];
    
    
       $truck[2]->post_parent = $driver[2]
       $driver[2]->post_parent = $truck[2];
    

    .. 等々

HTMLのヒント

私たちは2つのテーブルを持っています1つはドライバーで、もう1つはトラックです。各アイテムの投稿タイプのIDを出力します。

<h1>Drivers</h2>
<ul id="drivers">
    <li data-id="1">Driver 1</li>
    <li data-id="2">Driver 2</li>
    <li data-id="3">Driver 3</li>
    <li data-id="4">Driver 4</li>
    <li data-id="5">Driver 5</li>
</ul>


<h1>Trucks</h2>
<ul id="trucks">
    <li data-id="11">Truck 1</li>
    <li data-id="12">Truck 2</li>
    <li data-id="13">Truck 3</li>
    <li data-id="14">Truck 4</li>
    <li data-id="15">Truck 5</li>
</ul>

2. JS/JQ

あなたがjs/jqソートを使用しようとしていると仮定します。おそらくjqueryのUIソートライブラリ。商品(トラック/運転手)のいずれかがソートされたとき。あなたは両方のリストを調べて、順番に投稿IDを集めます。

// after sorting complete run this function as a callback

function wpse155095_get_data(){
    var drivers = [];
    var trucks = [];

    // get all drivers ID
    $('#drivers li').each(function(){
      var id = $(this).data('id');
      drivers.Push(id);
    });

    // get all trucks ID
    $('#trucks li').each(function(){
      var id = $(this).data('id');
      trucks.Push(id);
    });

   // Now Send both data to server via ajax call
   drivers = JSON.stringify(drivers); // array to json conversion
   trucks = JSON.stringify(trucks); // array to json conversion

   var data = {};
   data.action = 'wpse155095_save_data';
   data.trucks = trucks;
   data.drivers = drivers;

   // important: I've omitted nonce for simplicity. You should pass nonce via ajax check when receive data on ajax callback.

   $.ajax({
      url: ajaxurl, // in admin area ajaxurl is defined.
      type: 'POST',
      data: data
   });

}

3. AJAXハンドラ:

それに入る前に。 どのように私は追跡するつもりです どのトラックがどの運転手に属しているか、そしてその逆もありますか?そのために投稿テーブルのpost_parentフィールドを使用します。ポストメタを使用できる人もいます。それも大丈夫です。

Driver#1Truck #11に割り当てられている場合

Driver #1 post parent = 11
Truck #11 post parent = 1

私は奇妙なことを知っている、彼らはそれぞれ同じ時間でお互いに子供たちと親になるだろう:)

Jsコードが設定されたので、データとプロセスを受け取るためのphpコードを追加できます。

add_action( 'wp_ajax_wpse155095_save_data', 'ajax_wpse155095_save_data' );
function ajax_wpse155095_save_data(){

    // check nonce or other validation

    $drivers = ( isset($_POST['drivers']) && !empty($_POST['drivers']) ) ? json_decode($_POST['drivers'], true) : false;


    $trucks = ( isset($_POST['trucks']) && !empty($_POST['trucks']) ) ? json_decode($_POST['trucks'], true) : false;

   if( !$drivers || !$trucks )
      die(0); // or show some other error;

   if( count($drivers) != count($trucks) )
      die('count mismatch'); // or show some other error

   for( $i = 0; $i < count($drivers) ; $i++ ){
     $driver_id = $drivers[$i];
     $truck_id = $truck[$i]

     // everytime driver or truck changes. You will need to update both driver and truck field
     wp_update_post(array('ID' => $driver_id, 'post_parent' => $truck_id ));
     wp_update_post(array('ID' => $truck_id, 'post_parent' => $driver_id ));

   }

    die();
}

注: 毎回運転手が新しいトラックを割り当てました。あなたは運転手とトラックの両方の投稿タイプのpost_parentフィールドを更新する必要があります。

これが一般的な方法です。

6
Sisir