เพิ่มฟิลด์ที่กำหนดเองในหมวดหมู่


22

ฉันต้องการเพิ่มฟิลด์ที่กำหนดเองลงในหมวดหมู่ที่แน่นอน หมวดหมู่มีฟิลด์ต่อไปนี้เท่านั้น:

ชื่อ:

กระสุน:

ต้นทาง:

รายละเอียด:

เนื่องจากฉันมีไซต์ซีรี่ส์ทีวีฉันต้องการเพิ่มฟิลด์เพิ่มเติมฉันต้องการสิ่งนี้เมื่อฉันสร้างหมวดหมู่ใหม่ (หมวดหมู่ = ซีรี่ส์)

ชื่อ:

ศิลปิน:

ปี:

ประเภท:

ประเภท:

สรุป:

กระสุน:

ต้นทาง:

รายละเอียด:

และอื่น ๆ ...

ความช่วยเหลือใด ๆ โปรด? ขอบคุณล่วงหน้า.



นี่คือสูตรโกงที่ฉันใช้เมื่อทำสิ่งนี้ มันมี hooks การกระทำและตัวกรองที่เกี่ยวข้องในรายการสั้น ๆ charlestonsw.com/…
แลนซ์คลีฟแลนด์

คำตอบ:


24

ฉันโพสต์วิธีการเกี่ยวกับเรื่องนี้ในสัปดาห์ที่แล้วhttp://en.bainternet.info/2011/wordpress-category-extra-fields

หวังว่านี่จะช่วยได้

Ohad


นี่คือรายละเอียดของการโพสต์:

สิ่งแรกที่เราต้องทำคือเพิ่มฟิลด์พิเศษลงในแบบฟอร์มแก้ไขหมวดหมู่โดยใช้ hook edit_category_form_fields และเราใช้ฟังก์ชั่นง่าย ๆ ที่จะพิมพ์ฟิลด์พิเศษ

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

ดังที่คุณเห็นฉันได้เพิ่ม 4 ฟิลด์ใหม่และทั้งหมดอยู่ในอาร์เรย์ Cat_meta [คีย์] เนื่องจากวิธีที่เราสร้างเฉพาะในแถวในตารางตัวเลือกเพื่อบันทึกฟิลด์พิเศษทั้งหมดของหมวดหมู่แทนที่จะเป็นแถวสำหรับแต่ละฟิลด์

ต่อไปเราต้องบันทึกเขตข้อมูลพิเศษลงในฐานข้อมูลเมื่อผู้ใช้ส่งแบบฟอร์มแก้ไขหมวดหมู่และเราทำโดยใช้ "edited_category" กับฟังก์ชั่นที่จะทำงานในแต่ละเขตข้อมูลที่ส่งและแทรกลงในฐานข้อมูลโดยใช้ฟังก์ชัน update_option , อย่างนี้:

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

จากรหัสด้านบนคุณจะเห็นว่าฟิลด์พิเศษทั้งหมดที่เราเพิ่มเข้าไปนั้นถูกเก็บไว้ในตารางตัวเลือกของฐานข้อมูลพร้อมชื่อ 'category_ID' โดยที่ ID คือ ID ของหมวดหมู่เฉพาะที่เราเพิ่งแก้ไขและนั่นหมายความว่าเราสามารถเรียกสิ่งนี้ได้ ข้อมูลในปลั๊กอินหรือไฟล์ธีมของเราได้อย่างง่ายดายโดยใช้ฟังก์ชั่น get_option

พูดเช่นรหัสหมวดหมู่ของฉันคือ 25 แล้วรหัสของฉันจะมีลักษณะ

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

ตามที่ระบุไว้ในตอนต้นฉันจำเป็นต้องแสดงภาพที่แตกต่างกันสำหรับแต่ละหมวดหมู่ดังนั้นในกรณีนั้นฉันเพิ่มโค้ดสองสามบรรทัดเหล่านี้ลงใน category.php ของธีมของฉันทันทีหลังจากโค้ดที่แสดงชื่อหมวดหมู่:

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

เป็นคนดีและใช้งานง่ายและเราทุกคนก็ทำได้ ผลลัพธ์ควรมีลักษณะเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่


4
โปรดโพสต์เนื้อหาหลักของบล็อกของคุณลงในคำตอบนี้ Link rot สามารถเกิดขึ้นได้แม้ในบล็อกของคุณเอง
Django Reinhardt

1
สิ่งนี้ได้รับคำตอบในปี 2011 เพื่อน :)
Bainternet

1
ประเด็นของคุณคืออะไร?
Django Reinhardt

4
หากคุณไม่คิดว่าคำตอบนี้มีค่าอะไรควรลบ ... อย่างไรก็ตามคำถามนี้มีผู้ชมมากกว่า 16,000 ครั้ง ฉันคิดว่าคำถามนี้ยังคงมีประโยชน์สำหรับผู้คนแม้จะอายุเท่าไรและคำตอบนี้จะได้รับการปรับปรุงโดยรวมถึงรายละเอียดจากลิงก์ในคำถาม
Django Reinhardt

4
... ในขณะที่พวกคุณกำลังยุ่งอยู่กับการโต้วาที (หนึ่งปีที่แล้วถึงแม้ว่า) ฉันใช้เวลาน้อยกว่า 5 นาทีในการหาคำตอบ มันง่าย ...
MxmastaMills

18

ในฐานะของ Wordpress 4.4 มีการเพิ่มฟังก์ชั่นadd_term_meta () , update_term_meta ()และget_term_meta () ซึ่งหมายความว่ารหัสที่ให้บริการโดย MxmastaMills สามารถอัปเดตเพื่อใช้วิธีแฮ็กที่น้อยกว่ามาก

นี่คือการอัปเดตของฉัน มีเพียงหนึ่งฟิลด์ที่ฉันต้องการเพิ่มชื่อที่กำหนดเอง แต่มันจะทำงานเหมือนกันสำหรับทุกฟิลด์ที่คุณต้องการเพิ่ม

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
สิ่งที่ควรทราบ: ในedited_categoryเบ็ดtag_IDจะอยู่ในอาเรย์ไม่ได้อยู่ใน$_POST $_GETนอกจากนี้add_term_metaจะเพิ่มรายการใหม่แทนการแทนที่รายการเก่าที่เป็นไปได้ ใช้update_term_metaแทน
Martin Dimitrov

@MartinDimitrov คุณสามารถแก้ไขคำตอบของลุคซิมมอนส์ได้โดยคลิกที่ปุ่มแก้ไข? วิธีนี้ทุกคนสามารถใช้รหัสที่ดีที่สุดที่มีอยู่แม้ผู้ที่ไม่ได้รหัสดีนัก (นักออกแบบที่นี่!) ขอขอบคุณ!
Hugo

1
มันไม่ได้บันทึกข้อมูลในรูปแบบ
Dev

@Dev มันบันทึกข้อมูล แต่ไม่แสดงจนกว่าคุณจะเปลี่ยน $ _POST เป็น $ _GET ในบรรทัดที่สอง
banesto

3

รหัสนี้ทำงาน:

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

นี่มันเงอะงะน้อยกว่าอีกอันหนึ่งและฉันเพิ่งยืนยันกับ WordPress 5.2.2
nico gawenda

1

พอล Menard มีให้ตัวอย่างของวิธีการสร้างและใช้งานในระยะเมตาในบล็อกของเขา ... เกิด
เมตาที่กำหนดเองสำหรับ taxonomies ใหม่ใน WordPress 3.0

ไม่มีตัวอย่างของการสร้างตาราง DB หรือการตรวจสอบ$_POSTชุด vars ดังนั้นคุณจะต้องทำสิ่งเล็ก ๆ น้อย ๆ เหล่านั้นด้วยตัวเอง แต่ดูเหมือนว่าจะเป็นฐานรหัสที่ดีในการสร้าง ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.