Utilizzare un campo personalizzato come titolo del post personalizzato

10 nov 2011, 06:29:47
Visualizzazioni: 14.9K
Voti: 3

Ho configurato un tipo di post personalizzato con una serie di campi personalizzati utilizzando la classe WPAlchemy. Sto cercando di prendere il valore di uno di questi campi e usarlo come titolo del post. Finora, però, non ho avuto successo. Ho cercato in giro e ho provato i seguenti due blocchi di codice:

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

E... (commentando temporaneamente i campi nonce finché non capisco come funzionano)

add_filter('wp_insert_post_data', 'change_title', 99, 2);
function change_title($data, $postarr)
{    
    // Se il nostro form non è stato inviato, non vogliamo fare nulla
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    // Verifica che questa richiesta provenga dalla nostra schermata e con la giusta autorizzazione perché save_post può essere attivato in altri momenti
   // if(!isset($_POST['my_nonce_field'])) return;

    // Se il nonce è impostato, verificalo
   // if(isset($_POST['my_nonce_field']) && !wp_verify_nonce($_POST['my_nonce_field'], plugins_url(__FILE__))) return;

       // Combina l'indirizzo con il termine
    $title = $_POST['listing_name'];
    $data['post_title'] = $title;

    return $data;
}

In entrambi i casi, i risultati sono gli stessi:

  1. Al salvataggio del nuovo post, ricarica la pagina, dice che ha funzionato, ma tutti i campi personalizzati sono vuoti. (Senza nessuno dei due codici in esecuzione, il post personalizzato funziona correttamente e i campi vengono salvati).

  2. Visualizzando l'indice del tipo di post personalizzato, i post non sono presenti.

Qualche idea?

AGGIORNAMENTO

Per chiarire, sto utilizzando un post personalizzato senza il supporto al titolo. Tuttavia, sto cercando di popolare comunque il campo del titolo utilizzando il valore presente nel campo personalizzato.

0
Tutte le risposte alla domanda 3
3

Quindi, ogni volta che salvi un articolo, vuoi sostituire il valore del titolo appena salvato con un altro valore proveniente da un campo personalizzato...

Sembra che dovresti semplicemente inserire quello che vuoi come titolo nel campo del titolo effettivo.

MA presumo che sia per scopi di presentazione: vuoi che quel tipo di articolo personalizzato mostri un titolo diverso sul front end in base al valore di un campo personalizzato. I filtri sarebbero un modo semplice per ottenere questo risultato.

the_title, il comune tag template, è un wrapper molto leggero intorno a get_the_title, che contiene un filtro chiamato the_title. Riceve due argomenti: il titolo effettivo e l'ID dell'articolo. Agganciati a quello e cambia il titolo in base al tuo campo personalizzato.

<?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;
}

Alcune cose da tenere a mente sul tuo codice:

Le azioni non ricevono argomenti in modo arbitrario. Le funzioni agganciate a init per esempio, non ricevono alcun argomento passato loro. Quando do_action viene chiamato, il primo argomento è un nome di hook. Gli argomenti successivi sono quelli che vengono passati alle funzioni agganciate se lo desideri (specificato dal quarto, argomenti opzionali di add_action).

La chiamata do_action( 'init' ); è in wp-settings.php. Dai un'occhiata, nessun argomento.

Quindi questo:

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

Non funzionerà come ti aspetti. Inoltre, le chiamate add_action all'interno della funzione possono essere semplicemente da sole al di fuori della funzione... Questo funziona bene:

add_action('save_post', 'custom_post_type_title', 100);
function custom_post_type_title( $post_id ) {
    // fai qualcosa
}

Hai bisogno di fare qualcosa solo su save_post, non su quello e publish_post

Cerco sempre di evitare di andare direttamente a $wpdb se posso, perché molte volte ci sono API più convenienti. Quello che stavi cercando di fare è aggiornare un articolo. Quindi usa wp_update_post. Nel tuo caso, questa non è un'opzione valida (come afferma il codex, può causare un loop infinito).

È stato un po' prolisso, scusa. Spero che abbia chiarito alcune cose sul sistema degli hook di WordPress!

Rendili i tuoi migliori amici:

10 nov 2011 07:40:53
Commenti

Christopher, grazie per i pensieri dettagliati! Li analizzerò e li assorbirò più a fondo. Per chiarire, però, sto effettivamente cercando di creare un custom post type senza utilizzare il campo del titolo e poi far apparire un titolo (composto da un campo personalizzato), sia nel front end che nel backend (nell'elenco dei custom post). Questo chiarisce?

Jonathan Wold Jonathan Wold
10 nov 2011 19:21:34

Il filtro che ti ho mostrato funzionerà per questo. Se vuoi eliminare completamente il campo del titolo, c'è un argomento nell'array $args per register_post_type chiamato post_type_supports, impostalo così 'post_type_supports' => array( 'content' ), niente più titolo nella schermata di modifica.

chrisguitarguy chrisguitarguy
10 nov 2011 21:47:01

Ha funzionato! Quindi, sto usando un filtro per ottenere l'effetto desiderato. Se provassi a recuperare il valore, ad esempio tramite WPDB, del campo post_title, otterrei il valore "auto draft" - corretto? Il "purista" in me vorrebbe sistemare questo aspetto, anche se capisco che il "filtro" funziona. Hai qualche pensiero? GRAZIE per l'aiuto!

Jonathan Wold Jonathan Wold
11 nov 2011 04:05:35
0

Grazie, il tuo filtro ha funzionato perfettamente.

Per tua informazione

Ho aggiunto un controllo per verificare se siamo nell'Admin per evitare di modificare l'entry-title con il mio "longtitle" personalizzato (il valore predefinito è menu-item-title) durante la modifica di una pagina.


function pcdg_filter_title( $title, $post_id )
{
    if(!is_admin())
    {
        if( $new_title = get_post_meta( $post_id, 'longtitle', true ) )
        {
            return $new_title;
        }
    }
    return $title;
}
add_filter( 'the_title','pcdg_filter_title',10,2 );

25 mar 2015 13:08:08
0

Questo è fantastico, come potrei aggiungere più campi personalizzati se volessi, ad esempio, creare una scheda per un agente immobiliare:

posizione • occupanti • prezzo

come titolo filtrato invece di mostrare solo il nome di un singolo campo personalizzato.

Grazie!

29 ago 2023 02:01:34