Come faccio a salvare i metadati solo per un tipo di post personalizzato specifico?


16

Sto cercando di impostare un tipo di post personalizzato seguendo questo tutorial . Tuttavia, sono un po 'confuso su come / dove implementare update_post_meta(). Il tutorial suggerisce questo modello:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

Il che funziona, ma ha lo sfortunato effetto di aggiungere quei metadati a tutti i post, che appartengano o meno a questo tipo personalizzato.

Ho inserito quanto sopra functions.phpe suppongo che potrebbe essere parte del problema. Suppongo di dover limitare l'azione "save_post" per attivare solo i post del mio tipo personalizzato.


Bella domanda Bobby Jack, ma posso chiederti di rinominare la domanda in qualcosa come "Come salvare i metadati solo per specifici tipi di post personalizzati"; com'è il tuo titolo è troppo generico per essere riconosciuto dalle persone quando cercano una soluzione a questo problema.
MikeSchinkel,

@Mike: fatto (d'accordo con il tuo suggerimento, grazie!)
Bobby Jack,

Risposte:


18
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

Dovrebbe funzionare. Sostituisci semplicemente "your_post_type" con il nome del tipo di post. Inoltre, fatto poco noto: l'hook 'save_post' passa l'ID del post come argomento.

MODIFICARE

Ho aggiornato la funzione per riflettere il commento di Jan. Grazie Jan!


1
Aggiunge anche il post stesso come secondo argomento , quindi non è necessario utilizzare la variabile globale.
Jan Fabry,

Questa soluzione funziona ... L'ho già utilizzata su progetti client con molto successo.
EAMann

Brillante: funziona come un fascino. E presumo che avrebbe senso fare "if ($ post-> post_type == 'animal') {update_post_meta ($ ID," number_of_legs ", $ _POST ['number_of_legs']);} else if ($ post-> post_type == 'veicolo') {update_post_meta ($ ID, "number_of_wheels", $ _POST ['number_of_wheels']);} // ... ecc ... per gestire diversi tipi di post? (Chiedere scusa per scarse capacità di formattazione dei commenti!)
Bobby Jack,

In realtà, con più post-tipi, raccomanderei invece di usare un'istruzione switch. Meno markup, prestazioni più veloci, più facile aggiungere casi in futuro.
EAMann,

@EAMann - sì, a metà della stesura di questo, mi sono reso conto che un passaggio sarebbe meglio, ma i commenti non sono il posto ideale per iniziare a modificare il codice, quindi sono diventato pigro;)
Bobby Jack

4

Se vuoi gestire più tipi di post, ti consiglio una semplice istruzione switch:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

I casi sono sostanzialmente gli stessi di if($post->post_type) == 'post_type_1') {}Ma non richiedono più blocchi if-else. Il defaultblocco nello switch gestisce i casi in cui il tipo di post non è nel tuo set personalizzato.


4

@John P Bloch e @EAMann hanno già dato ottime risposte, quindi la mia è in aggiunta:

  1. Prendi in considerazione il prefisso dei meta_key con un trattino basso . In questo modo li nascondi dall'elenco dei campi personalizzati visualizzati in una schermata di modifica post, ad es

    funzione save_my_metadata ($ post_id, $ post = false) {
       if ($ post-> post_type == 'your_post_type')
          update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }
    
    Ovviamente ciò significa che avresti bisogno di un metabox personalizzato per poter modificare anche i campi. Ecco una schermata di modifica per il contesto:



  2. Un'altra cosa che potresti fare è aggiungere il tuo hook per rendere più facile il salvataggio di specifici tipi di post, cioè il tuo hook potrebbe essere " save_{$post_type}_post"; per un movietipo di post sarebbe save_movie_post. Ecco cosa dovresti aggiungere al functions.phpfile del tuo tema o in un plugin da qualche parte:

    add_action ('save_post', 'save_custom_post_type_posts', 10,2);
    funzione save_custom_post_type_posts ($ post_id, $ post = false) {
       do_action ( "salva _ {$ post-> post_type} _POST");
    }
    
    Con ciò puoi quindi riscrivere il tuo codice originale in questo modo (incluso il trattino di sottolineatura dal n. 1 sopra):

    add_action ( 'save_my_postype_post', 'save_my_postype_metadata', 10,2);
    funzione save_my_postype_metadata ($ post_id, $ post) {
        update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }

1

Personalmente, preferisco seguire il modello seguente per aggiungere meta handler personalizzati ai tipi di post. Con quanto segue, è possibile aggiungere il meta supporto a un tipo di post semplicemente aggiungendo la chiave di supporto ('sottotitolo' nell'esempio seguente) all'array di supporti per il tipo di post chiamando add_post_type_support ('my_post_type', 'subtitle');

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

Speriamo che qualcosa del genere venga presto aggiunto al nucleo.


0

Prima dell'aggiornamento controlla se il post corrente è o meno del tuo tipo di post. Ciò garantirebbe di non salvarlo per tutti i post.

Dovresti controllare anche l'input (che manca nel tuo esempio) e accanto a questo, tieni presente che potresti aggiungere l'azione solo quando quel tipo di post è attivo. In tal caso, non è necessario verificare quel tipo di post in seguito.

Ottenere un tipo di messaggi: get_post_type()o$post->post_type;


0

Non riesco a farlo funzionare - non sono sicuro di cosa sto facendo di sbagliato - ma sto cercando di utilizzare l'hook post_updated anziché il save_post - poiché voglio che questi valori vengano inseriti dopo l'aggiornamento del post in modo da poter recuperare i valori dagli altri campi personalizzati .

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');

Nevermind - L'ho capito!
jrutter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.