WP-Post-PHP-Funktion einfügen und benutzerdefinierte Felder
4 Antworten
- Stimmen
-
- 2011-02-04
Wenn Sie die Dokumentation zu
wp_insert_post
lesen,wird die zurückgegeben Beitrags-ID desgeradeerstellten Beitrags.Wenn Sie diesmit derfolgenden Funktion kombinieren
__update_post_meta code> (einebenutzerdefinierte Funktion,dieich von dieser Siteerworben undein wenig angepasst habe)
/** * Aktualisiert Post-Metafüreinen Post. Außerdem wird der Wertfür Feldname automatischgelöscht oder hinzugefügt,falls angegeben * * * @accessgeschützt * @paraminteger Die Beitrags-IDfür den Beitrag,den wir aktualisieren * @param string Das Feld,das wir aktualisieren/hinzufügen/löschen * @param string [Optional] Der Wert,derfür Feldname aktualisiert/hinzugefügt werden soll. Wenn Sie dieses Feld leer lassen,werden die Datengelöscht. * @return void */ öffentliche Funktion __update_post_meta ($post_id,$field_name,$ value='') { if (leer ($ value) ODER! $ value) { delete_post_meta ($post_id,$field_name); }} elseif (!get_post_meta ($post_id,$field_name)) { add_post_meta ($post_id,$field_name,$ value); }} sonst { update_post_meta ($post_id,$field_name,$ value); }} }}
Sieerhalten Folgendes:
$my_post=array ( 'post_title'=> $ _SESSION ['Buchungsformular-Titel'], 'post_date'=> $ _SESSION ['cal_startdate'], 'post_content'=> 'Diesistmein Beitrag.', 'post_status'=> 'veröffentlichen', 'post_type'=> 'Buchung', ); $the_post_id=wp_insert_post ($my_post); __update_post_meta ($the_post_id,'my-custom-field','my_custom_field_value');
If you read the documentation for
wp_insert_post
, it returns the post ID of the post you just created.If you combine that with the following function
__update_post_meta
(a custom function I acquired from this site and adapted a bit)/** * 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 ); } }
You'll get the following:
$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' );
-
Vielen Dank.Könnten Siemir vielleichteine Idee zur Implantationgeben?IE.was aber von Codegeht wohin.Danke vielmalsThanks very much. Could you possibly give me an idea on the implantation. IE. which but of code goes where. Many Thanks
- 0
- 2011-02-04
- Robin I Knight
-
Schöngemacht.Der zweite Codeblockersetzt Ihren,die Funktionswerte sind dasbenutzerdefinierte Feldschlüssel/Wert-Paar.Fügen Sie die Funktionentweder obenim Skript oderin einer separaten .php-Datei obenim Skriptein.Nicely done. The second code block replaces yours, the function values is the custom field key/value pair. Put the function either at the top of the script, or in a separate .php file included at the top of the script.
- 2
- 2011-02-04
- aendrew
-
Als Hinweis verwendeich OOP,daherist dies der Grundfür den Modifikator "public" vor "function".Wenn Sie die Funktion selbsteinschließen,ohne sieeiner Klasse zuzuordnen,müssen Sienicht "public" hinzufügenAs a note, I do use OOP so that's the reason for the `public` modifier in front of "function". If you're including the function itself without putting it into a class, you don't need to add `public`
- 1
- 2011-02-05
- Zack
-
Hallo Zack,Aendrew und Philip.Allesfunktioniert wunderbar,aberich habe versucht,es auch vergeblich aufeine Abfrage anzuwenden.Ich verstehenichtganz warum.Hierist der Link,da Sie alle wissen,wie das ursprünglichebenutzerdefinierte Feldneuer Beitragfunktioniert hat. Ich dachte,Sie könntenmeinen Fehler sehen.http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fieldsHello Zack, Aendrew and Philip. Everything is working beautifully however I tried to apply it to a query as well to no avail. I don't quite see why. Here is the link since you all know how the initial custom field new post worked I thought you might see my error. http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fields
- 0
- 2011-02-05
- Robin I Knight
-
@Zack - Schöne Antwort.Aberich würdeeher davor zurückschrecken,führende Unterstrichein Funktionsnamen zu verwenden,schon allein deshalb,weil Namenmit führenden Unterstrichen von Plattformentwicklern verwendet werden,wenn sie _ "reservierte" _ oder _ (pseudo) "versteckte" _ Funktionenerstellenmöchten,damit MenschenWenn Sie diese sehen,denken Siemöglicherweise,dass sie Plattformfunktionen sind,oder schlimmernoch,sie stehenin Konfliktmit einer zukünftigen WordPress-Kernfunktion.Nurein Gedanke.@Zack - Nice answer. But I would tend to shy away from using leading underscores in function names if only because names with leading underscores tend to be used by platform developers when they want to create _"reserved"_ or _(pseudo) "hidden"_ functions so people seeing those might think they are platform functions, or worse they might conflict with a future WordPress core function. Just a thought.
- 0
- 2011-02-05
- MikeSchinkel
-
@MikeSchinkel: Zuerst habeich ursprünglich "__"fürgeschützte Funktioneninnerhalbeiner Klasse verwendet,dann aber die Strukturmeines Plugins dahingehendgeändert,dass die Funktion öffentlich seinmusste.Ich hättees aucheinfach "update_post_meta"genannt,aber das hätte definitivmit den Kernfunktionen von WordPressin Konfliktgeraten.Also wussteichnicht,wieichesnennen sollte :(@MikeSchinkel: At first, I originally started using "__" for protected functions within a class, but then changed the structure of my plugin to where the function needed to be public. I also would've named it simply "update_post_meta" but that would've definitely conflicted with WordPress' core functions. So I didn't know what to name it :(
- 0
- 2011-02-05
- Zack
-
@Zack - Vielleicht `zacks_update_post_meta ()`?:) Das andere Problem,dasichbei führenden Unterstrichennichterwähnt habe,ist,dassjemand anderes,dergleichermaßen kreativist,möglicherweise dieselbe Konventionin einem Plugin verwendet und somitmit Ihrerin Konflikt steht.Übrigens,wussten Sie,dass `update_post_meta ()` hinzugefügt wird,wennesnichtexistiert?`add_post_meta ()` wirdnurbenötigt,wenn Sie doppelte Schlüssel hinzufügenmöchten.@Zack - Maybe `zacks_update_post_meta()`? :) The other issue I didn't mention with leading underscores is that someone else equally creative may use the same convention in a plugin and thus conflict with yours. BTW, did you know that `update_post_meta()` adds if it doesn't exist? `add_post_meta()` is only needed when you want to add duplicate keys.
- 0
- 2011-02-05
- MikeSchinkel
-
@ MikeSchinkel: Ich habe die Funktion ursprünglich an anderer Stelle auf dieser Sitegefunden,mochte sie und habe sie überarbeitet,nur weilich sobin.Ich dachte auch,dass "update_post_meta ()" das schongetan hat,konntemir abernicht sicher sein.Alsich die Funktiongefunden habe,bin ich zu Schlussfolgerungengesprungen.@MikeSchinkel: I originally found the function elsewhere on this site, liked it, and refactored it just because I'm like that. I also figured `update_post_meta()` did that already, but couldn't be sure. When I found the function, I jumped to conclusions.
- 0
- 2011-02-05
- Zack
-
@Zack - Hey,WordPress zu lernenisteine Reise.Ichglaube,ich habenochmindestens 50%mehr von dieser Reise übrig,wennnichtnoch vielmehr!@Zack - Hey learning WordPress is a journey. I figure I still have at least 50% more of that journey left, if not a lot more!
- 0
- 2011-02-05
- MikeSchinkel
-
Ich kann keine Antwort hinzufügen,daich auf wordpress.stackexchange keinen Ruf habe.Ab heutegibt eseine neue Methode,Sie könneneinfachein Arrayin wp_insert_posteinfügen als:meta_input=> array (key=> value)I can't add an answer, as I don't have reputation on wordpress.stackexchange. As of today there is a new method, you can simply put in an array into wp_insert_post as: meta_input => array(key=>value)
- 1
- 2016-10-15
- Frederik Witte
-
- 2011-02-05
Sie könneneinfach die 'add_post_meta'nach der '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); ?>
You can simple add the 'add_post_meta' after the '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', ); $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); ?>
-
- 2011-02-04
Verwenden Sie den Filter
save_post
und rufen Sie dannin Ihrer Filterfunktionadd_post_meta
auf.Use
save_post
filter, then calladd_post_meta
in your filter function.-
Nicht hilfreich.$post-> IDistfür wp_insert_post_datanicht verfügbar,was zum Erstellenbenutzerdefinierter Feldererforderlichist.Unhelpful. $post->ID is not available to wp_insert_post_data, which is necessary for creating custom fields.
- 0
- 2011-02-04
- aendrew
-
Die Aktion @aendrew `save_post`befindet sichganz am Ende der Funktion. Die ID und das Objekt des Posts wurden übergeben. Die Antwortist korrekt.@aendrew `save_post` action is at the very end of the function, it has post's ID and object passed to it, answer is sound.
- 0
- 2011-02-05
- Rarst
-
Ichbin mir ziemlich sicher,dass diesbearbeitet wurde,Rarst.Unabhängig davonmachtesjetzt Sinn.I'm pretty sure this was edited, Rarst. Regardless, it makes sense now.
- 1
- 2011-02-05
- aendrew
-
@aendrew ah,sorry - habe dasnichtbemerkt@aendrew ah, sorry - didn't notice that
- 0
- 2011-02-05
- Rarst
-
- 2011-02-04
Ichglaubenicht,dass Sieesmit wp_insert_post (); verwenden können.
Der Grund liegt darin,wie WP diebeiden Datentypen speichert. Beiträge werdenin einergroßenmonolithischen Tabellemit einem Dutzend verschiedener Spalten (wp_posts)gespeichert. Benutzerdefinierte Felder werdenin einereinfacheren 4-Spalten-Tabelle (wp_postmeta)gespeichert,die hauptsächlich auseinem Metaschlüssel undeinem Wertbesteht,dieeinem Beitrag zugeordnet sind.
Folglich können Siebenutzerdefinierte Feldererst dann wirklich speichern,wenn Sie die Post-ID haben.
Versuchen Sie Folgendes:
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 hatgeholfen -erist das Gegenteil von dem,was Sietun (dh das Löscheneiner DB-Zeilebeim Löschen des Beitrags): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post
I don't think you can use it with wp_insert_post();.
The reason is because of how WP stores the two data types. Posts are stored in one big monolithic table with a dozen different columns (wp_posts); custom fields are stored in a simpler, 4-column table (wp_postmeta) comprised mainly of a meta key and value, associated with a post.
Consequently, you can't really store custom fields until you have the post ID.
Try this:
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);
This codex post helped -- it's kinda the opposite of what you're doing (i.e., deleting a DB row upon post deletion): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post
-
In diesem Fallist dereinzige Ausweg,denich sehen kann,die Verwendungeiner Sitzung. Wäre das richtig?In that case the only way out I can see is to use a session, would that be correct.
- 0
- 2011-02-04
- Robin I Knight
-
Nee;Ich vermute,Ihr Plugin versucht,benutzerdefinierte Feldereinzufügen,währendein Beitraggespeichert wird,oder?Ich denke,Siemüssen sichnach dem Speichern des Postsin WPeinbinden,dieneue ID-Nummer des Posts abrufen und diese dann an add_post_meta () weitergeben.um die CFs zuerstellen.Ich werdemeine Antwortin einer Sekundemit etwas Code aktualisieren.Nah; I'm guessing your plugin is trying to insert custom fields at the same time a post is saved, right? I think what you need to do is hook into WP after the post is saved, grab the post's new ID number, then supply that to add_post_meta(); to create the CFs. I'll update my answer in a second with some code.
- 0
- 2011-02-04
- aendrew
-
Dankefür die Hilfe.Übrigensistes kein Plugin.Ich habeesgeschrieben,damit wires so oft wienötig anpassen können.(aber verstehe dasnicht so,dassichgutmit PHP umgehen kann,nur Versuch und Irrtum)Thanks for the help. By the way its not a plugin. I wrote it so we can customise it as much as needed. (but don't take that to mean I'm any good with php, just trial and error)
- 0
- 2011-02-04
- Robin I Knight
-
Esist alsoein Thema?Dereinzige wirkliche Unterschiedbesteht darin,dass Sie diesin diesem Fallin functions.phpeinfügen.It's a theme, then? Only real difference is you'd put that in functions.php, in that case.
- 0
- 2011-02-04
- aendrew
Mit der WordPress-Funktion werden Datenprogrammgesteuert übermittelt.Standardfelder,dieeingereicht werdenmüssen,um Inhalt,Auszug,Titel,Datum und vielesmehreinzuschließen.
Für die Übermittlung anein benutzerdefiniertes Feldgibt es keine Dokumentation.Ich weiß,dass diesmit der Funktion
add_post_meta($post_id, $meta_key, $meta_value, $unique);
möglichist.Aber wie kannman dasin die Standardfunktion
wp_insert_post
aufnehmen?