it-swarm.com.de

Benutzerdefiniertes Feld als benutzerdefinierten Beitragstitel verwenden

Ich habe einen benutzerdefinierten Beitragstyp mit einer Reihe von benutzerdefinierten Feldern mithilfe der WPAlchemy-Klasse eingerichtet. Ich versuche, den Wert eines der benutzerdefinierten Felder als Beitragstitel zu verwenden. Bisher hatte ich jedoch keinen Erfolg. Ich habe mich umgesehen und die folgenden zwei verschiedenen Codeblö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 .. (vorübergehend 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 Beitrags wird die Seite neu geladen, es hat funktioniert, und alle benutzerdefinierten Felder sind leer. (Wenn keiner der Codesätze ausgeführt wird, funktioniert der benutzerdefinierte Beitrag einwandfrei und die Felder werden gespeichert.).

  2. Beim Anzeigen des benutzerdefinierten Beitragstypindex sind die Beiträge nicht vorhanden.

Irgendwelche Ideen?

UPDATE

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

3
Jonathan Wold

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 solltest du einfach, was auch immer du willst, den Titel in das eigentliche Titelfeld eintragen.

ABER ich gehe davon aus, dass dies zu Präsentationszwecken dient: Sie möchten, dass dieser benutzerdefinierte Beitragstyp einen anderen Titel am Front-End anzeigt, der auf dem Wert eines benutzerdefinierten Felds basiert. Filter wären eine einfache Möglichkeit, dies zu erreichen.

the_title, das gebräuchliche Template-Tag, ist ein sehr dünner Wrapper um get_the_title, der einen Filter namens the_title enthält. Es gibt zwei Argumente: den tatsächlichen Titel und die Beitrags-ID. Schließen Sie sich dem an 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 zu beachten:

Aktionen erhalten keine willkürlichen Argumente. Mit init verknüpfte Funktionen erhalten beispielsweise keine Argumente. Wenn do_action aufgerufen wird, ist das erste Argument ein Hook-Name. Nachfolgende Argumente werden an Hook-In-Funktionen übergeben, wenn Sie dies wünschen (angegeben durch die vierten Optionsargumente von add_action).

der Aufruf von do_action( 'init' ); befindet sich in der Datei wp-settings.php. Werfen Sie einen Blick , 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 Sie es erwarten. Darüber hinaus können die add_action-Aufrufe innerhalb der Funktion nur für sich allein außerhalb der Funktion sein ... Dies funktioniert einwandfrei:

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

Ich muss nur save_post bearbeiten, nicht publish_post

Ich versuche immer zu vermeiden, direkt zu $wpdb zu gehen, wenn ich kann, weil es oft bequemere APIs gibt. Sie haben versucht, einen Beitrag zu aktualisieren. Verwenden Sie also wp_update_post . In Ihrem Fall ist dies keine gültige Option (wie im Codex angegeben, kann dies zu einer Endlosschleife führen).

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

Machen Sie diese zu Ihren besten Freunden:

3
chrisguitarguy

Vielen Dank, dass Ihr Filter ein Vergnügen war.

Zu Ihrer Information

Ich habe eine Prüfung hinzugefügt, um festzustellen, ob in Admin der Eintragstitel während der Bearbeitung einer Seite in meinen benutzerdefinierten "Langtitel" (Standard = Menüelementtitel) geändert wurde.

 Funktion pcdg_filter_title ($ title, $ post_id) 
 {
 if (! is_admin ()) 
 {
 if ($ new_title = get_post_meta ( $ post_id, 'longgtitle', true)) 
 {
 $ new_title zurückgeben; 
} 
} 
 $ title zurückgeben; 
} 
 add_filter ('the_title', 'pcdg_filter_title', 10,2); 
0
PC Doctor Go