WP-Insert-Post-PHP-Funktion und benutzerdefinierte Felder

26

Die WordPress-Funktion wird zum programmgesteuerten Senden von Daten verwendet. Standardfelder, die eingereicht werden müssen, um den Inhalt, den Auszug, den Titel, das Datum und vieles mehr aufzunehmen.

Es gibt keine Dokumentation dafür, wie ein benutzerdefiniertes Feld eingereicht wird. Ich weiß, dass es mit der add_post_meta($post_id, $meta_key, $meta_value, $unique);Funktion möglich ist.

Aber wie kann man das in die Standardfunktion aufnehmen wp_insert_post?

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );
  wp_insert_post( $my_post );
  ?>
Robin ich Ritter
quelle

Antworten:

35

Wenn Sie die Dokumentation für lesen wp_insert_post, wird die Beitrags-ID des soeben erstellten Beitrags zurückgegeben.

Wenn Sie dies mit der folgenden Funktion kombinieren __update_post_meta(eine benutzerdefinierte Funktion, die ich von dieser Site erworben und ein wenig angepasst habe)

/**
  * Updates post meta for a post. It also automatically deletes or adds the value to field_name if specified
  *
  * @access     protected
  * @param      integer     The post ID for the post we're updating
  * @param      string      The field we're updating/adding/deleting
  * @param      string      [Optional] The value to update/add for field_name. If left blank, data will be deleted.
  * @return     void
  */
public function __update_post_meta( $post_id, $field_name, $value = '' )
{
    if ( empty( $value ) OR ! $value )
    {
        delete_post_meta( $post_id, $field_name );
    }
    elseif ( ! get_post_meta( $post_id, $field_name ) )
    {
        add_post_meta( $post_id, $field_name, $value );
    }
    else
    {
        update_post_meta( $post_id, $field_name, $value );
    }
}

Sie erhalten Folgendes:

$my_post = array(
    'post_title' => $_SESSION['booking-form-title'],
    'post_date' => $_SESSION['cal_startdate'],
    'post_content' => 'This is my post.',
    'post_status' => 'publish',
    'post_type' => 'booking',
);
$the_post_id = wp_insert_post( $my_post );


__update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );
Zack
quelle
Vielen Dank. Könnten Sie mir möglicherweise eine Idee zur Implantation geben? IE. welches aber von code wohin geht. Vielen Dank
Robin I Knight
2
Schön gemacht. Der zweite Codeblock ersetzt Ihren, die Funktionswerte sind das benutzerdefinierte Schlüssel / Wert-Feldpaar. Platzieren Sie die Funktion entweder oben im Skript oder in einer separaten .php-Datei, die oben im Skript enthalten ist.
Endrew
1
Als Hinweis verwende ich OOP, das ist der Grund für den publicModifikator vor "function". Wenn Sie die Funktion selbst einbinden, ohne sie einer Klasse zuzuordnen, müssen Sie nicht hinzufügenpublic
Zack
Hallo Zack, Aendrew und Philip. Alles funktioniert wunderbar, aber ich habe versucht, es auch auf eine Abfrage ohne Erfolg anzuwenden. Ich verstehe nicht genau warum. Hier ist der Link, da Sie alle wissen, wie der erste benutzerdefinierte Feld-Beitrag funktioniert hat. Ich dachte, Sie könnten meinen Fehler sehen. wordpress.stackexchange.com/questions/8622/…
Robin I Knight
1
Ich kann keine Antwort hinzufügen, da ich bei wordpress.stackexchange keinen guten Ruf habe. Ab heute gibt es eine neue Methode, die Sie einfach in wp_insert_post einfügen können: meta_input => array (key => value)
Frederik Witte
13

Sie können einfach das 'add_post_meta' nach dem 'wp_insert_post' hinzufügen

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );

$post_id = wp_insert_post($my_post);

add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true);
add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true);
?>
Philip
quelle
1

Ich glaube nicht, dass Sie es mit wp_insert_post () verwenden können.

Der Grund dafür ist, wie WP die beiden Datentypen speichert. Posts werden in einer großen monolithischen Tabelle mit einem Dutzend verschiedener Spalten (wp_posts) gespeichert. Benutzerdefinierte Felder werden in einer einfacheren Tabelle mit vier Spalten (wp_postmeta) gespeichert, die hauptsächlich aus einem Metaschlüssel und einem Wert besteht, die einem Beitrag zugeordnet sind.

Folglich können Sie benutzerdefinierte Felder erst dann wirklich speichern, wenn Sie die Post-ID haben.

Versuche dies:

function myplugin_insert_customs($pid){

    $customs = array(
    'post_id' => $pid,
    'meta_key' => 'Your meta key',
    'meta_value' => 'Your meta value',
    );

    add_post_meta($customs);

}

add_action('save_post', 'myplugin_insert_customs', 99);

Dieser Codex-Beitrag hat geholfen - es ist ein bisschen das Gegenteil von dem, was Sie tun (dh das Löschen einer DB-Zeile nach dem Löschen): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

aendrew
quelle
In diesem Fall ist der einzige Ausweg, den ich sehen kann, die Verwendung einer Sitzung, wäre das richtig.
Robin I Knight
Nein; Ich vermute, Ihr Plugin versucht, benutzerdefinierte Felder einzufügen, während ein Beitrag gespeichert wird, oder? Ich denke, Sie müssen sich nach dem Speichern des Posts in WP einbinden, die neue ID-Nummer des Posts abrufen und diese dann an add_post_meta () übergeben. um die CFs zu erstellen. Ich werde meine Antwort in Kürze mit etwas Code aktualisieren.
4.
Danke für die Hilfe. Übrigens ist es kein Plugin. Ich habe es geschrieben, damit wir es nach Bedarf anpassen können. (Aber verstehen Sie das nicht, dass ich mit PHP gut umgehen kann, nur mit Versuch und Irrtum)
Robin I Knight
Es ist also ein Thema? Der einzige wirkliche Unterschied ist, dass Sie das in die functions.php schreiben würden.
4.
1

Verwenden Sie save_postfilter und rufen add_post_metaSie dann Ihre Filterfunktion auf.

Micah Ernst
quelle
Nicht hilfreich. $ post-> ID ist für wp_insert_post_data nicht verfügbar, was zum Erstellen benutzerdefinierter Felder erforderlich ist.
4.
@aendrew save_postaction steht ganz am Ende der Funktion. Die ID und das Objekt des Posts wurden übergeben. Die Antwort ist ein akustisches Signal .
Rarst
1
Ich bin mir ziemlich sicher, dass dies bearbeitet wurde, Rarst. Egal, es macht jetzt Sinn.
Endrew
@aendrew ah, sorry - habe das nicht bemerkt
Rarst