Dodaj niestandardowe pole do kategorii

22

Chciałbym dodać niestandardowe pola do określonej kategorii. Kategoria ma tylko następujące pola:

Imię:

Ślimak:

Rodzic:

Opis:

Ponieważ mam witrynę z serialami telewizyjnymi, chcę dodać więcej pól, chcę coś takiego podczas tworzenia nowej kategorii (kategoria = serial)

Imię:

Artysta:

Rok:

Rodzaj:

Gatunek muzyczny:

Podsumowanie:

Ślimak:

Rodzic:

Opis:

I tak dalej...

Proszę o pomoc? Z góry dziękuję.

Earlee
źródło
Oto ściągawka, której używam, robiąc to. Ma odpowiednie haczyki i filtry na jednej krótkiej liście. charlestonsw.com/…
Lance Cleveland

Odpowiedzi:

24

Opublikowałem Poradę na ten temat tydzień temu http://en.bainternet.info/2011/wordpress-category-extra-fields

mam nadzieję że to pomoże.

Ohad.


Oto szczegóły wpisu:

Pierwszą rzeczą, którą musimy zrobić, to dodać dodatkowe pola do formularza edycji kategorii za pomocą haka edit_category_form_fields i używamy prostej funkcji, która wydrukuje dodatkowe pola.

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

Jak widać dodałem 4 nowe pola i wszystkie z nich są w tablicy Cat_meta [klucz], ponieważ w ten sposób tworzymy tylko wiersz w tabeli opcji, aby zapisać wszystkie dodatkowe pola kategorii zamiast wiersza dla każdego pola.

Następnie musimy zapisać dodatkowe pola w bazie danych, gdy użytkownik prześle formularz edycji kategorii i zrobimy to za pomocą „edytowanej_kategorii” z funkcją, która przejdzie przez każde z przesłanych pól i wstawi je do bazy danych za pomocą funkcji update_option , lubię to:

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

Z powyższego kodu widać, że wszystkie dodatkowe pola, które dodaliśmy, są przechowywane w tabeli opcji bazy danych o nazwie „category_ID”, gdzie ID to identyfikator konkretnej kategorii, którą właśnie edytowaliśmy, a to oznacza, że ​​możemy to nazwać dane w naszych wtyczkach lub plikach motywów łatwo za pomocą funkcji get_option.

powiedzmy na przykład, że mój identyfikator kategorii to 25, wtedy mój kod będzie wyglądał

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

Jak wspomniałem na początku, muszę wyświetlić inny obraz dla każdej kategorii, dlatego w tym przypadku dodałem kilka wierszy kodu do kategorii mojej kompozycji. Php zaraz po kodzie, który wyświetla tytuł kategorii:

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

Ładnie i łatwo i wszyscy jesteśmy skończeni. Wynik powinien wyglądać podobnie do tego:

wprowadź opis zdjęcia tutaj

Bainternet
źródło
4
Prześlij główną treść swojego bloga do tej odpowiedzi. Gnicie linków mogą się zdarzyć, nawet na własnym blogu.
Django Reinhardt
1
Odpowiedzi
udzielił
1
Twoim celem jest?
Django Reinhardt
4
Jeśli nie uważasz, że ta odpowiedź ma jakąkolwiek wartość, należy ją usunąć ... Jednak to pytanie ma ponad 16 000 wyświetleń. Myślę, że pytanie pozostaje użyteczne dla ludzi, pomimo jego wieku, i odpowiedź ta zostałaby poprawiona poprzez uwzględnienie szczegółów z odnośnego łącza.
Django Reinhardt
4
... podczas gdy byliście zajęci debatowaniem nad tym (choć rok temu, ale zajęło mi to mniej niż 5 minut, aby wszystko udzielić odpowiedzi. To proste ...
MxmastaMills
19

Począwszy od Wordpress 4.4, dodano funkcje add_term_meta () , update_term_meta () i get_term_meta () . Oznacza to, że kod podany przez MxmastaMills można zaktualizować, aby zastosować znacznie mniej hackerskie podejście.

Oto moja aktualizacja. Jest tylko jedno pole, które chciałem dodać niestandardowy tytuł, ale będzie działać tak samo dla wszystkich pól, które chcesz dodać.

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
źródło
2
Kilka rzeczy do zapamiętania: w edited_categoryhaczyku tag_IDbędzie w $_POSTtablicy, a nie w $_GET. W add_term_metarzeczywistości doda także nowy wpis zamiast zastępowania możliwego starego. Użyj update_term_metazamiast tego.
Martin Dimitrov
@MartinDimitrov Czy możesz naprawić odpowiedź Luke-Simmonsa, klikając przycisk edycji? W ten sposób każdy może użyć najlepszego dostępnego kodu, nawet ten, który nie koduje zbyt dobrze (tutaj projektant!). Dziękuję Ci!
Hugo,
1
Nie zapisuje danych w formularzu
Dev
@Dev zapisuje dane, po prostu ich nie pokazuje, chyba że zmienisz $ _POST na $ _GET w drugiej linii.
banesto
3

Ten kod działa:

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
źródło
Jest to mniej niezręczne niż inne i właśnie zweryfikowałem to za pomocą WordPress 5.2.2
nico gawenda
1

Paul Menard podał przykład tworzenia i korzystania z meta terminów na swoim blogu ...
Meta niestandardowe dla nowych systematyk w WordPress 3.0 .

Nie ma przykładu tworzenia tabeli DB lub sprawdzania, czy $_POSTzmienne są ustawione, więc musisz sam zrobić te małe rzeczy, ale wygląda to na porządną bazę kodu do zbudowania na ... :)

t31os
źródło