Fügen Sie der Kategorie ein benutzerdefiniertes Feld hinzu

22

Ich möchte einer bestimmten Kategorie benutzerdefinierte Felder hinzufügen. Eine Kategorie enthält nur die folgenden Felder:

Name:

Slug:

Elternteil:

Beschreibung:

Da ich eine TV-Serien-Site habe, möchte ich weitere Felder hinzufügen. Wenn ich eine neue Kategorie erstelle, möchte ich Folgendes tun (Kategorie = Serie)

Name:

Künstler:

Jahr:

Art:

Genre:

Zusammenfassung:

Slug:

Elternteil:

Beschreibung:

Und so weiter...

Irgendeine Hilfe bitte? Danke im Voraus.

Earlee
quelle
Hier ist ein Spickzettel, den ich dabei verwende. Es hat die relevanten Aktions-Hooks und Filter in einer kurzen Liste. charlestonsw.com/…
Lance Cleveland

Antworten:

24

Ich habe vor einer Woche ein How To darüber gepostet http://en.bainternet.info/2011/wordpress-category-extra-fields

hoffe das hilft.

Ohad.


Hier sind die Details des Beitrags:

Als Erstes müssen wir die zusätzlichen Felder mit dem Hook edit_category_form_fields zum Formular zur Kategoriebearbeitung hinzufügen und verwenden eine einfache Funktion, mit der die zusätzlichen Felder ausgedruckt werden.

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

Wie Sie sehen, habe ich 4 neue Felder hinzugefügt, die sich alle in einem Array Cat_meta [key] befinden, da wir auf diese Weise nur eine Zeile in der Optionstabelle erstellen, um alle zusätzlichen Felder der Kategorie anstelle einer Zeile für jedes Feld zu speichern.

Als nächstes müssen wir die zusätzlichen Felder in der Datenbank speichern, sobald ein Benutzer das Kategorie-Bearbeitungsformular abschickt, und dies unter Verwendung von "edited_category" mit einer Funktion, die alle übermittelten Felder durchläuft und sie mit der Funktion update_option in die Datenbank einfügt , so was:

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

Aus dem obigen Code können Sie ersehen, dass alle zusätzlichen Felder, die wir hinzugefügt haben, in der Optionstabelle der Datenbank mit dem Namen 'category_ID' gespeichert sind, wobei ID die ID der spezifischen Kategorie ist, die wir gerade bearbeitet haben, und das heißt, wir können dies aufrufen Daten in unseren Plugins oder Themendateien einfach mit der Funktion get_option.

Angenommen, meine Kategorie-ID ist 25, dann sieht mein Code so aus

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

Wie eingangs erwähnt, muss ich für jede Kategorie ein anderes Bild anzeigen. In diesem Fall habe ich die category.php meines Themas direkt nach dem Code, der den Kategorietitel anzeigt, um diese wenigen Codezeilen ergänzt:

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

Schön und einfach und wir sind alle fertig. Das Ergebnis sollte ungefähr so ​​aussehen:

Bildbeschreibung hier eingeben

Bainternet
quelle
4
Bitte posten Sie den Hauptinhalt Ihres Blogs in dieser Antwort. Link Rot kann auch in Ihrem eigenen Blog vorkommen.
Django Reinhardt
1
Dies wurde beantwortet am 2011 Kumpel :)
Bainternet
1
Ihr Punkt ist?
Django Reinhardt
4
Wenn Sie der Meinung sind, dass diese Antwort keinen Wert hat, sollten Sie sie löschen ... Diese Frage hat jedoch mehr als 16.000 Aufrufe. Ich denke, die Frage bleibt trotz ihres Alters für die Menschen nützlich, und diese Antwort würde verbessert, wenn die Details aus dem fraglichen Link aufgenommen würden.
Django Reinhardt
4
... während ihr darüber debattiert habt (allerdings vor einem Jahr), habe ich weniger als 5 Minuten gebraucht, um alles in die Antwort zu bringen. Es ist einfach ...
MxmastaMills
18

Ab Wordpress 4.4 wurden die Funktionen add_term_meta () , update_term_meta () und get_term_meta () hinzugefügt. Dies bedeutet, dass der von MxmastaMills zur Verfügung gestellte Code aktualisiert werden kann, um einen weitaus weniger hackigen Ansatz zu verwenden.

Hier ist mein Update davon. Es gibt nur ein Feld, da ich einen benutzerdefinierten Titel hinzufügen wollte, aber es funktioniert für alle Felder, die Sie hinzufügen möchten, gleich.

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');
Luke Simmons
quelle
2
Einige Dinge, die zu beachten sind: im edited_categoryHook, tag_IDwird im $_POSTArray sein, nicht im $_GET. Außerdem add_term_metawird tatsächlich ein neuer Eintrag hinzugefügt, anstatt einen möglichen alten zu überschreiben. Verwenden Sie update_term_metastattdessen.
Martin Dimitrov
@MartinDimitrov Könnten Sie die Antwort von luke-simmons korrigieren, indem Sie auf die Schaltfläche "Bearbeiten" klicken? Auf diese Weise kann jeder den besten verfügbaren Code verwenden, auch wer nicht sehr gut codiert (Designer hier!). Vielen Dank!
Hugo
1
Es speichert die Daten nicht in der Form
Dev
@Das Programm speichert zwar Daten, zeigt sie jedoch nur an, wenn Sie in der zweiten Zeile $ _POST in $ _GET ändern.
Banesto
3

Dieser Code funktioniert:

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'] );
});
Mario62RUS
quelle
Dies ist weniger umständlich als das andere und ich habe es gerade mit WordPress 5.2.2 überprüft
nico gawenda
1

Paul Menard lieferte in seinem Blog ein Beispiel für das Erstellen und Verwenden von Term-Metas ...
Benutzerdefinierte Metas für neue Taxonomien in WordPress 3.0 .

Es gibt kein Beispiel für das Erstellen der DB-Tabelle oder das Überprüfen, ob $_POSTVariablen festgelegt wurden. Sie müssen diese kleinen Dinge also selbst erledigen, aber es sieht aus wie eine anständige Codebasis, auf der Sie aufbauen können ... :)

t31os
quelle