Kategoriye özel alan ekle


22

Belirli bir kategoriye özel alanlar eklemek istiyorum. Bir kategori yalnızca aşağıdaki alanları içerir:

Ad:

Slug:

Veli:

Açıklama:

Bir TV Dizisi Sitem olduğundan, daha fazla alan eklemek istiyorum, yeni bir kategori oluştururken böyle bir şey istiyorum (Kategori = Seri)

Ad:

Sanatçı:

Yıl:

Tür:

Tür:

Özet:

Slug:

Veli:

Açıklama:

Ve bunun gibi...

Herhangi bir yardım lütfen? Şimdiden teşekkürler.



İşte bunu yaparken kullandığım bir hile. Kısa bir listede ilgili eylem kancaları ve filtreleri vardır. charlestonsw.com/…
Lance Cleveland,

Yanıtlar:


24

Bir hafta önce bu konuda bir Nasıl yayınladım http://en.bainternet.info/2011/wordpress-category-extra-fields

Bu yardımcı olur umarım.

Ohad.


İşte yazının detayları:

Yapmamız gereken ilk şey, edit_category_form_fields kancasını kullanarak kategori düzenleme formuna fazladan alanlar eklemek ve fazladan alanları basacak basit bir işlev kullanmaktır.

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

Gördüğünüz gibi 4 yeni alan ekledim ve hepsi Cat_meta [key] dizisinde yer alıyor, çünkü bu şekilde sadece her kategorideki satır yerine tüm kategorideki ekstra alanları kaydetmek için seçenekler tablosunda satırda yaratıyoruz.

Daha sonra, kullanıcı kategori düzenleme formunu gönderdiğinde, ek alanları veri tabanına kaydetmemiz gerekir ve bunu, gönderilen alanların her birini çalıştıracak bir işlevle "edited_category" kullanarak ve update_option işlevini kullanarak bunları veritabanına ekleriz. , bunun gibi:

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

Yukarıdaki koddan eklediğimiz tüm ekstra alanların veritabanındaki seçenekler tablosunda 'category_ID' adında olduğunu görebilirsiniz; burada ID, yeni düzenlediğimiz belirli kategorinin kimliğidir ve bu, bunu arayabiliriz. eklentilerimizdeki veya tema dosyalarındaki verileri get_option işlevini kullanarak kolayca.

mesela kategori kimliğimin 25 olduğunu söyledikten sonra kodum benzeyecek

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

Başlangıçta belirttiğim gibi, her kategori için farklı bir resim görüntülemem gerekiyor, bu durumda bu birkaç kod satırını, kategorinin başlığını gösteren kodun hemen ardından kendi kategorim.php dosyasına ekledim:

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

Güzel ve kolay ve hepimiz bitti. Sonuç şuna benzemelidir:

görüntü tanımını buraya girin


4
Lütfen blogunuzun ana içeriğini bu cevaba gönderin. Link rot, kendi blogunuzda bile olabilir.
Django Reinhardt

1
Bu 2011
dostumda

1
Demek istediğin?
Django Reinhardt

4
Bu cevabın herhangi bir değeri olmadığını düşünüyorsanız, silinmeli ... Ancak bu sorunun 16.000'den fazla görüşü var. Sanırım sorunun yaşına rağmen, insanlar için faydalı olmaya devam ettiğini ve bu cevabın söz konusu linkten detayları içererek daha iyi olacağını düşünüyorum.
Django Reinhardt

4
... siz çocuklar bunu tartışmakla meşgul olsanız da (bir yıl önce de olsa), her şeyi cevaba ulaştırmak 5 dakikadan az sürdü. Bu kolay ...
MxmastaMills

18

Wordpress 4.4'ten itibaren, add_term_meta () , update_term_meta () ve get_term_meta () işlevleri eklenmiştir. Bu, MxmastaMills tarafından sağlanan kodun çok daha az sahte bir yaklaşım kullanacak şekilde güncellenebileceği anlamına gelir.

İşte benim güncellemem. Özel bir başlık eklemek istediğim tek bir alan var, ancak eklemek istediğiniz tüm alanlar için aynı şekilde çalışacak.

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
Dikkat edilecek birkaç şey: edited_categorykancada, tag_IDiçinde $_POSTdeğil , dizide olacaktır $_GET. Ayrıca add_term_metaaslında eski olanı geçersiz kılmak yerine yeni bir giriş ekleyecektir. Yerine update_term_metakullanın.
Martin Dimitrov

@MartinDimitrov luke-simmons'ın cevabını düzenle düğmesine tıklayarak düzeltebilir misiniz? Bu şekilde, herkes çok iyi kodlamamış olsa bile, mevcut en iyi kodu kullanabilir (tasarımcı burada!). Teşekkür ederim!
Hugo

1
Formdaki verileri
Dev

@Dev veri kaydetmez, sadece $ _POST işlevini ikinci satırda $ _GET olarak değiştirmediyseniz göstermez.
Banesto

3

Bu kod çalışması:

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

Bu diğerinden daha az sakar ve sadece WordPress 5.2.2 ile doğruladım
nico gawenda

1

Paul Menard, blogunda meta terimini nasıl oluşturacağına ve kullanacağına bir örnek verdi ...
WordPress 3.0'daki yeni taksonomiler için özel meta .

DB tablosu oluşturmanın veya $_POSTvars ayarlarının kontrol edilmesine dair hiçbir örnek yoktur , bu yüzden bu küçük şeyleri kendiniz yapmanız gerekir, ancak üstüne inşa etmek için iyi bir kod tabanı gibi görünüyor ... :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.