web-dev-qa-db-ger.com

Speichern Sie den benutzerdefinierten Beitragstyp in einer anderen Tabelle

Ich muss benutzerdefinierte Post-Typ-Post-Daten in einer benutzerdefinierten Tabelle speichern, nicht in wp_posts und wp_postmeta. Ist es möglich? jemand hilft bitte. Eigentlich habe ich zwei benutzerdefinierte Beitragstypen mit den Namen "truck" und "drivers" erstellt. Dann habe ich eine Menüseite in WordPress Admin erstellt. Klicken Sie auf dieses Menü, um alle Fahrer aufzulisten, die mit dem LKW zu tun haben. Es sollte auch ein Drag & Drop-System für diese Schnittstelle geben, damit ich jedem Fahrer einen LKW zuweisen kann. Nach dem Sortieren sollte die Tabelle aktualisiert werden. Also brauche ich eine neue Tabelle für den benutzerdefinierten Beitragstyp. see my screenshot

2
Arshad Hussain

Ich bin zwar ein großer Fan der Optimierung von WordPress, so gut es geht, weil es uns erlaubt, aber ich denke, der beste Weg ist, den besten Algorithmus vor dem Codieren zu haben.

Als ich Ihre Frage las, stieß ich auf "Actually, I have created two custom post type named 'truck' and 'drivers'".

Problem: Das Verknüpfen von zwei Beitragstypen erfordert zusätzliche Arbeit, da dies von Haus aus nicht das ist, was Wordpress tut.

Lösungsvorschlag: Tun Sie es, wie WP natürlich funktioniert: Link a Custom Post Type to a taxonomy. Anstatt also "LKW" und "Fahrer" als CPTs zu haben, müssen Sie "Fahrer" als CPT und "LKW" als Taxonomie haben! Das erspart Ihnen jede Menge Arbeit und insbesondere das Risiko, auf Probleme zu stoßen, sollte WP aktualisiert werden.

Anschließend können Sie die benutzerdefinierte Funktionalität zum Ziehen und Ablegen in CPT und Taxonomie erstellen

3
Janvier

Ich werde keinen bestimmten Code angeben, aber ich werde Ihnen eine Idee geben, wie dies ohne die Erstellung einer benutzerdefinierten Datenbanktabelle geschehen kann. Ich gehe davon aus ein Fahrer pro LKW

Algorithmus

  1. Erstelle zwei HTML-Listen, mach sie sortierbar.
  2. Jedes Listenelement stellt einen Beitragstyp dar und verfügt über ein ID-Datenfeld.
  3. Sobald die Sortierung abgeschlossen ist, erhalten Sie alle IDs in der richtigen Reihenfolge. Machen Sie zwei Array enthält eine LKW-IDs andere Fahrer-IDs.
  4. Senden Sie sie über Ajax.
  5. Durchlaufen Sie eines der Felder für die Array-Aktualisierungsbeiträge nach dem übergeordneten Element, sodass

       $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];
    

    .. und so weiter

HTML-Hinweis

Wir haben zwei Tische, einen Fahrer und einen LKW. Wir geben die ID für den Posttyp für jeden Artikel aus.

<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

Angenommen, Sie verwenden die js/jq-Sortierung. Vielleicht jquery ui sortierbare Bibliothek. Wenn einer der Artikel (LKW/Fahrer) sortiert wird. Sie gehen die beiden Listen durch und sammeln die Post-IDs in einer Reihenfolge.

// 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 Handler:

Bevor wir uns darauf einlassen. Wie werde ich verfolgen welcher LKW gehört zu welchem ​​Fahrer und umgekehrt? Ich werde dafür das Feld post_parent für die Post-Tabellen verwenden. Einige können Post-Meta verwenden. Das ist auch gut so.

Wenn Driver#1Truck #11 zugewiesen ist, dann

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

Ich weiß, seltsam, sie werden sich gegenseitig Kinder und Eltern zugleich sein :)

Jetzt, da wir js Code-Setup haben, können wir PHP-Code zum Empfangen der Daten und des Prozesses hinzufügen.

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();
}

Hinweis: Jeder Fahrer einen neuen LKW zugewiesen. Sie müssen das Feld post_parent sowohl für Fahrer- als auch für LKW-Posttypen aktualisieren.

Dies ist im Allgemeinen, wie es getan werden kann.

6
Sisir