Aggiungi campo personalizzato alla categoria


22

Vorrei aggiungere campi personalizzati a una determinata categoria. Una categoria ha solo i seguenti campi:

Nome:

Slug:

Genitore:

Descrizione:

Dal momento che ho un sito di serie TV, voglio aggiungere altri campi, voglio qualcosa del genere, quando creo una nuova categoria (Categoria = Serie)

Nome:

Artista:

Anno:

Genere:

Genere:

Sommario:

Slug:

Genitore:

Descrizione:

E così via...

Qualche aiuto per favore? Grazie in anticipo.



Ecco un cheat sheet che uso per fare questo. Ha i relativi hook e filtri di azione in un breve elenco. charlestonsw.com/…
Lance Cleveland,

Risposte:


24

Ho pubblicato un How To a questo proposito una settimana fa http://en.bainternet.info/2011/wordpress-category-extra-fields

spero che sia di aiuto.

Ohad.


Ecco i dettagli del post:

La prima cosa che dobbiamo fare è aggiungere i campi extra al modulo di modifica della categoria usando il gancio edit_category_form_fields e usiamo una semplice funzione che stamperà i campi extra.

<?php
//add extra fields to category edit form hook
add_action ( 'edit_category_form_fields', 'extra_category_fields');

//add extra fields to category edit form callback function
function extra_category_fields( $tag ) {    //check for existing featured ID
    $t_id = $tag->term_id;
    $cat_meta = get_option( "category_$t_id");
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_Image_url"><?php _e('Category Image Url'); ?></label></th>
<td>
<input type="text" name="Cat_meta[img]" id="Cat_meta[img]" size="3" style="width:60%;" value="<?php echo $cat_meta['img'] ? $cat_meta['img'] : ''; ?>"><br />
        <span class="description"><?php _e('Image for category: use full url with '); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra1"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra1]" id="Cat_meta[extra1]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra1'] ? $cat_meta['extra1'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra2"><?php _e('extra field'); ?></label></th>
<td>
<input type="text" name="Cat_meta[extra2]" id="Cat_meta[extra2]" size="25" style="width:60%;" value="<?php echo $cat_meta['extra2'] ? $cat_meta['extra2'] : ''; ?>"><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="extra3"><?php _e('extra field'); ?></label></th>
<td>
        <textarea name="Cat_meta[extra3]" id="Cat_meta[extra3]" style="width:60%;"><?php echo $cat_meta['extra3'] ? $cat_meta['extra3'] : ''; ?></textarea><br />
        <span class="description"><?php _e('extra field'); ?></span>
    </td>
</tr>
<?php
}

Come puoi vedere, ho aggiunto 4 nuovi campi e tutti sono in un array Cat_meta [chiave] perché in questo modo creiamo solo una riga nella tabella delle opzioni per salvare tutti i campi extra della categoria anziché una riga per ogni campo.

Successivamente dobbiamo salvare i campi extra nel database una volta che un utente invia il modulo di modifica della categoria e lo facciamo usando "modificato_categoria" con una funzione che verrà eseguita attraverso ciascuno dei campi inviati e li inserirà nel database usando la funzione update_option , come questo:

<?php
// save extra category extra fields hook
add_action ( 'edited_category', 'save_extra_category_fileds');

// save extra category extra fields callback function
function save_extra_category_fileds( $term_id ) {
    if ( isset( $_POST['Cat_meta'] ) ) {
        $t_id = $term_id;
        $cat_meta = get_option( "category_$t_id");
        $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key){
            if (isset($_POST['Cat_meta'][$key])){
                $cat_meta[$key] = $_POST['Cat_meta'][$key];
            }
        }
        //save the option array
        update_option( "category_$t_id", $cat_meta );
    }
}

Dal codice sopra puoi vedere che tutti i campi extra che abbiamo aggiunto sono memorizzati nella tabella delle opzioni del database con il nome 'ID_categoria', dove ID è l'id della categoria specifica che abbiamo appena modificato e ciò significa che possiamo chiamarlo dati nei nostri plugin o file tematici facilmente usando la funzione get_option.

ad esempio, il mio ID categoria è 25, quindi il mio codice sarà simile

<?php $cat_data = get_option('category_25'); ?>

Come ho affermato all'inizio, ho bisogno di visualizzare un'immagine diversa per ogni categoria, quindi in quel caso ho aggiunto queste poche righe di codice alla categoria.php del mio tema subito dopo il codice che mostra il titolo della categoria:

<?php
//first get the current category ID
$cat_id = get_query_var('cat');

//then i get the data from the database
$cat_data = get_option("category_$cat_id");

//and then i just display my category image if it exists
if (isset($cat_data['img'])){
    echo '<div class="category_image"><img src="'.$cat_data['img'].'"></div>';
}

Bello e facile e abbiamo finito. Il risultato dovrebbe essere simile al seguente:

inserisci qui la descrizione dell'immagine


4
Pubblica il contenuto principale del tuo blog in questa risposta. Il marcio dei link può accadere, anche sul tuo blog.
Django Reinhardt,

1
A questo è stato risposto un amico del 2011 :)
Bainternet,

1
Il tuo punto è?
Django Reinhardt,

4
Se non ritieni che questa risposta abbia alcun valore, dovrebbe essere eliminata ... Tuttavia, questa domanda ha oltre 16.000 visualizzazioni. Penso che la domanda rimanga utile per le persone, nonostante la sua età, e questa risposta sarebbe migliorata includendo i dettagli dal link in questione.
Django Reinhardt,

4
... mentre voi ragazzi eravate impegnati a discuterne (anche se un anno fa), mi ci sono voluti meno di 5 minuti per portare tutto nella risposta. È facile ...
MxmastaMills,

18

A partire da Wordpress 4.4, sono state aggiunte le funzioni add_term_meta () , update_term_meta () e get_term_meta () . Ciò significa che il codice fornito da MxmastaMills può essere aggiornato per utilizzare un approccio molto meno complicato.

Ecco il mio aggiornamento. C'è solo un campo in cui volevo aggiungere un titolo personalizzato, ma funzionerà allo stesso modo per tutti i campi che desideri aggiungere.

function addTitleFieldToCat(){
    $cat_title = get_term_meta($_POST['tag_ID'], '_pagetitle', true);
    ?> 
    <tr class="form-field">
        <th scope="row" valign="top"><label for="cat_page_title"><?php _e('Category Page Title'); ?></label></th>
        <td>
        <input type="text" name="cat_title" id="cat_title" value="<?php echo $cat_title ?>"><br />
            <span class="description"><?php _e('Title for the Category '); ?></span>
        </td>
    </tr>
    <?php

}
add_action ( 'edit_category_form_fields', 'addTitleFieldToCat');

function saveCategoryFields() {
    if ( isset( $_POST['cat_title'] ) ) {
        update_term_meta($_POST['tag_ID'], '_pagetitle', $_POST['cat_title']);
    }
}
add_action ( 'edited_category', 'saveCategoryFields');

2
Poche cose da notare: nel edited_categorygancio, tag_IDsarà nella $_POSTmatrice, non nel file $_GET. Inoltre add_term_metaaggiungerà effettivamente una nuova voce invece di sovrascrivere una possibile vecchia. Usa update_term_metainvece.
Martin Dimitrov,

@MartinDimitrov Potresti risolvere la risposta di luke-simmons facendo clic sul pulsante Modifica? In questo modo tutti possono usare il miglior codice disponibile, anche chi non scrive molto bene (designer qui!). Grazie!
Hugo,

1
Non salva i dati nel modulo
Dev

@Dev salva i dati, semplicemente non li mostra a meno che tu non cambi $ _POST in $ _GET nella seconda riga.
banesto,

3

Questo codice funziona:

add_action ( 'edit_category_form_fields', function( $tag ){
    $cat_title = get_term_meta( $tag->term_id, '_pagetitle', true ); ?>
    <tr class='form-field'>
        <th scope='row'><label for='cat_page_title'><?php _e('Category Page Title'); ?></label></th>
        <td>
            <input type='text' name='cat_title' id='cat_title' value='<?php echo $cat_title ?>'>
            <p class='description'><?php _e('Title for the Category '); ?></p>
        </td>
    </tr> <?php
});
add_action ( 'edited_category', function() {
    if ( isset( $_POST['cat_title'] ) )
        update_term_meta( $_POST['tag_ID'], '_pagetitle', $_POST['cat_title'] );
});

Questo è meno goffo dell'altro e l'ho appena verificato con WordPress 5.2.2
nico gawenda,

1

Paul Menard ha fornito un esempio di come creare e utilizzare il termine meta nel suo blog ...
Meta personalizzata per nuove tassonomie in WordPress 3.0 .

Non esiste alcun esempio di creazione della tabella DB o di controllo dei $_POSTparametri impostati, quindi dovrai fare da solo quelle piccole cose, ma sembra una base di codice decente da costruire sopra ... :)

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.