Benutzerdefiniertes Feld als benutzerdefinierten Beitragstitel verwenden

Ich habe einen benutzerdefinierten Post-Typ mit einer Reihe von benutzerdefinierten Feldern mit der WPAlchemy-class eingerichtet. Ich versuche, den Wert eines der benutzerdefinierten Felder zu verwenden und diesen als Posttitel zu verwenden. Bis jetzt hatte ich keinen Erfolg. Ich habe herumgesucht und die folgenden zwei verschiedenen Code-Blöcke ausprobiert:

function custom_post_type_title ( $post_id ) { global $wpdb; if ( get_post_type( $post_id ) == 'listing' ) { $title = get_post_meta($post_id, 'listing_name', true); $where = array( 'ID' => $post_id ); $wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where ); } } add_action('init', 'listing_save_post'); function listing_save_post( $post_id ) { if ( ! defined( 'DOING_AUTOSAVE' ) && ! DOING_AUTOSAVE ) return; add_action('save_post', 'custom_post_type_title', 100); add_action('publish_post', 'custom_post_type_title', 100); } 

Und .. (kurz die Nonce-Felder auskommentieren, bis ich herausgefunden habe, wie sie funktionieren)

 add_filter('wp_insert_post_data', 'change_title', 99, 2); function change_title($data, $postarr) { // If it is our form has not been submitted, so we dont want to do anything if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; // Verify this came from the our screen and with proper authorization because save_post can be triggered at other times // if(!isset($_POST['my_nonce_field'])) return; // If nonce is set, verify it // if(isset($_POST['my_nonce_field']) && !wp_verify_nonce($_POST['my_nonce_field'], plugins_url(__FILE__))) return; // Combine address with term $title = $_POST['listing_name']; $data['post_title'] = $title; return $data; } 

In beiden Fällen sind die Ergebnisse gleich:

  1. Beim Speichern des neuen Posts wird die Seite neu geladen, die function ausgeführt und alle benutzerdefinierten Felder sind leer. (Ohne Code-Set läuft der benutzerdefinierte Post gut und die Felder werden gespeichert).

  2. Beim Anzeigen des benutzerdefinierten Post-Typ-Indexes sind die Posts nicht vorhanden.

Irgendwelche Ideen?

AKTUALISIEREN

Zur Klarstellung verwende ich einen benutzerdefinierten Beitrag ohne Titelunterstützung. Ich versuche dennoch, das Titelfeld mit dem Wert im benutzerdefinierten Feld zu füllen.

Solutions Collecting From Web of "Benutzerdefiniertes Feld als benutzerdefinierten Beitragstitel verwenden"

Jedes Mal, wenn Sie einen Beitrag speichern, möchten Sie den Wert eines gerade gespeicherten Titels durch einen anderen Wert aus einem benutzerdefinierten Feld ersetzen …

Scheint so, als hättest du einfach was du willst, was der Titel sein soll, in das eigentliche Titelfeld gelegt.

ABER ich nehme an, dass dies für Präsentationszwecke ist: Sie möchten, dass dieser benutzerdefinierte Beitragstyp einen anderen Titel auf dem Frontend basierend auf dem Wert eines benutzerdefinierten Felds anzeigt. Filter wären eine einfache Möglichkeit, dies zu erreichen.

the_title , das gemeinsame Template-Tag, ist ein sehr dünner Wrapper um get_the_title , der einen Filter namens the_title . Es erhält zwei Argumente: den eigentlichen Titel und die Post-ID. Haken Sie sich ein und ändern Sie den Titel basierend auf Ihrem benutzerdefinierten Feld.

 < ?php add_filter( 'the_title', 'wpse33385_filter_title', 10, 2 ); function wpse33385_filter_title( $title, $post_id ) { if( $new_title = get_post_meta( $post_id, 'custom_field_name', true ) ) { return $new_title; } return $title; } 

Ein paar Dinge über Ihren Code im Hinterkopf behalten:

Aktionen erhalten keine willkürlichen Argumente. functionen, die beispielsweise in init , erhalten keine Argumente, die an sie übergeben werden. Wenn do_action aufgerufen wird, ist das erste Argument ein Hook-Name. Nachfolgende Argumente sind, was an functionen übergeben wird, wenn Sie es wünschen (spezifiziert durch die vierte, Optionsargumente von add_action ).

die do_action( 'init' ); Anruf ist in wp-settings.php. Schau , keine Argumente.

Also das:

 < ?php add_action('init', 'listing_save_post'); function listing_save_post( $post_id ) { if ( ! defined( 'DOING_AUTOSAVE' ) && ! DOING_AUTOSAVE ) return; add_action('save_post', 'custom_post_type_title', 100); add_action('publish_post', 'custom_post_type_title', 100); } 

Wird nicht so funktionieren, wie du es erwartest. Außerdem kann die add_action innerhalb der function add_action werden, kann aber außerhalb der function add_action ... Das funktioniert gut:

 add_action('save_post', 'custom_post_type_title', 100); function custom_post_type_title( $post_id ) { // do stuff } 

save_post brauche nur Sachen auf save_post , nicht auf publish_post und publish_post

Ich versuche immer zu vermeiden, direkt zu $wpdb wenn ich kann, weil es oft bequemere APIs gibt. Was Sie versucht haben, ist ein Post aktualisiert. Also benutze wp_update_post . In Ihrem Fall ist das keine gültige Option (wie der Codex angibt, kann es eine Endlosschleife verursachen).

Das war irgendwie langatmig, Entschuldigung. Hoffentlich hat es einige Dinge über das WordPress Hooks System geklärt!

Machen Sie diese zu Ihren besten Freunden:

Danke, dass dein Filter funktioniert hat.

FYI

Ich habe einen Check hinzugefügt, um zu sehen, ob ich im Admin den Eintrag-Titel in meinen benutzerdefinierten “Longtitle” (Standard = Menü-Item-Titel) ändern kann, während ich eine Seite bearbeite.

 function pcdg_filter_title ($ title, $ post_id)
 {
     if (! is_admin ())
     {
         if ($ neuer_titel = get_post_meta ($ post_id, 'langtitel', wahr))
         {
             return $ neuer_titel;
         }
     }
     return $ title;
 }
 add_filter ('the_title', 'pcdg_filter_title', 10,2);