ฉันจะเพิ่มฟิลด์ URL ในหน้าต่างสิ่งที่แนบได้อย่างไร


13

ตัวอย่างเช่น...

add_action('init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
}

เพิ่มฟิลด์อินพุต "หมวดหมู่" ไปยังตัวจัดการสื่อและตัวแก้ไขสิ่งที่แนบ ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะเปลี่ยนฟังก์ชั่นนี้เพื่อจับ URL "ลิงก์ปลายทาง" แทน URL จะถูกดำเนินการเมื่อมีการคลิกที่ภาพ

ต้องทราบวิธีการรับค่าสำหรับฟิลด์ใหม่นี้ด้วย

UPDATE: ขอบคุณโทมัสคำตอบด้านล่างนี่คือคำตอบสุดท้ายของฉัน ...

function my_image_attachment_fields_to_edit($form_fields, $post) {  
    $form_fields["custom1"] = array(  
        "label" => __("Image Links To"),  
        "input" => "text",
        "value" => get_post_meta($post->ID, "_custom1", true)  
    );        
    return $form_fields;  
}  

function my_image_attachment_fields_to_save($post, $attachment) {    
    if( isset($attachment['custom1']) ){  
        update_post_meta($post['ID'], '_custom1', $attachment['custom1']);  
    }  
    return $post;  
}  

add_filter("attachment_fields_to_edit", "my_image_attachment_fields_to_edit", null, 2); 
add_filter("attachment_fields_to_save", "my_image_attachment_fields_to_save", null, 2); 

1
อย่า "namespace" ฟังก์ชั่นของคุณด้วย "my_" มีคนจำนวนมากที่ทำสิ่งนี้อยู่แล้ว ;)
fuxia

ชอบที่จะรู้วิธีใช้สิ่งนี้ด้วยปุ่มตัวเลือก การเปลี่ยนประเภทไม่ได้ทำอะไรเลย
Drew Baker

@scottb แทนที่จะใส่คำตอบของคุณไว้ในคำถามคุณควรตัดมันออกจากที่นั่นแล้ววางลงในคำตอบแล้วยอมรับมัน บางคนคิดว่ามีอะไรบางอย่างที่ดูเหมือนจะไม่ค่อยยอมรับการตอบคำตอบของตัวเอง แต่มันก็ดีและช่วยในการค้นหาในอนาคต (เช่นฉัน) เพื่อให้ได้คำตอบจริงเร็วขึ้น
เจฟฟ์

คำตอบ:


16

ฉันใช้ปลั๊กอินคร่าวๆเพื่อเพิ่มข้อมูลเกี่ยวกับศิลปินและ URL ไปยังไฟล์มีเดีย มันต้องมีการปรับแต่ง (และฉันต้องการเวลา) แต่ก็ใช้งานได้และอาจแสดงให้เห็นถึงวิธีการเพิ่มฟิลด์พิเศษและวิธีใช้ในธีมของคุณ:

<?php
/*
Plugin Name: Media Artist Field
Description: Adds two field to attachments – Artist and Artist URL – and adds this information to captions.
Version:     0.1
Author:      Fuxia Scholz
Created:     19.09.2010
*/
$Media_Artist = new Media_Artist(
    array (
        'artist_name' => array (
            'public' => 'artist_name'
        ,   'hidden' => '_artist_name'
        ,   'label'  => 'Fotograf (Name)'
        )
    ,   'artist_url' => array (
            'public' => 'artist_url'
        ,   'hidden' => '_artist_url'
        ,   'label'  => 'Fotograf (URL)'
        )
    )
,   'Foto: '
);
/**
 * Adds two fields for credits to any media file: name and URL.
 *
 * Based on the clear tutorial by Andy Blackwell:
 * @link http://net.tutsplus.com/?p=13076
 */
class Media_Artist
{
    public
        $fields = array (
            'artist_name' => array (
                'public' => 'artist_name'
            ,   'hidden' => '_artist_name'
            ,   'label'  => 'Artist Name'
            )
        ,   'artist_url' => array (
                'public' => 'artist_url'
            ,   'hidden' => '_artist_url'
            ,   'label'  => 'Artist URL'
            )
        )
        // Maybe its own field?
    ,   $caption_prefix
    ,   $br_before = TRUE;

    public function __construct(
        $fields         = array()
    ,   $caption_prefix = 'Source: '
    ,   $br_before      = TRUE
    )
    {
        $this->fields         = array_merge($this->fields, $fields);
        $this->caption_prefix = $caption_prefix;
        $this->br_before      = (bool) $br_before;

        $this->set_filter();
    }

    public function set_filter()
    {
        add_filter(
            'attachment_fields_to_edit'
        ,   array ( $this, 'add_fields' )
        ,   15
        ,   2
        );
        add_filter(
            'attachment_fields_to_save'
        ,   array ( $this, 'save_fields' )
        ,   10
        ,   2
        );
        add_filter(
            'img_caption_shortcode'
        ,   array ( $this, 'caption_filter' )
        ,   1
        ,   3
        );
    }

    public function add_fields($form_fields, $post)
    {
        foreach ( $this->fields as $field)
        {
            $form_fields[ $field['public'] ]['label'] = $field['label'];
            $form_fields[ $field['public'] ]['input'] = 'text';
            $form_fields[ $field['public'] ]['value'] = get_post_meta(
                $post->ID
            ,   $field['hidden']
            ,   TRUE
            );
        }
        return $form_fields;
    }

    public function save_fields($post, $attachment)
    {
        foreach ( $this->fields as $field)
        {
            if ( isset ( $attachment[ $field['public'] ]) )
            {
                update_post_meta(
                    $post['ID']
                ,   $field['hidden']
                ,   $attachment[ $field['public'] ]
                );
            }
        }

        return $post;
    }

    public function caption_filter($empty, $attr, $content = '')
    {
        /* Typical input:
         * [caption id="attachment_525" align="aligncenter"
         * width="300" caption="The caption."]
         * <a href="http://example.com/2008/images-test/albeo-screengrab/"
         * rel="attachment wp-att-525"><img
         * src="http://example.com/uploads/2010/08/albeo-screengrab4.jpg?w=300"
         * alt="" title="albeo-screengrab" width="300" height="276"
         * class="size-medium wp-image-525" /></a>[/caption]
         */
        extract(
            shortcode_atts(
                array (
                    'id'        => ''
                ,   'align'     => 'alignnone'
                ,   'width'     => ''
                ,   'caption'   => ''
                ,   'nocredits' => '0'
                )
            ,   $attr
            )
        );

        // Let WP handle these cases.
        if ( empty ($id ) or 1 == $nocredits )
        {
            return '';
        }

        if ( 1 > (int) $width || empty ( $caption ) )
        {
            return $content;
        }

        if ( ! empty ( $id ) )
        {
            // Example: attachment_525
            $html_id     = 'id="' . esc_attr($id) . '" ';
            $tmp         = explode('_', $id);
            $id          = end($tmp);

            $sub_caption = '';
            $artist_name = get_post_meta($id, $this->fields['artist_name']['hidden'], TRUE);
            $artist_url  = get_post_meta($id, $this->fields['artist_url']['hidden'], TRUE);

            // Okay, at least one value.
            if ( '' != $artist_name . $artist_url )
            {
                $sub_caption .= $this->br_before ? '<br />' : '';
                $sub_caption .= '<span class="media-artist">' . $this->caption_prefix;

                // No name given. We use the shortened URL.
                if ( '' == $artist_name )
                {
                    $sub_caption .= '<a rel="author" href="'
                        . $artist_url . '">'
                        . $this->short_url($artist_url)
                        . '</a>';
                } // We have just the name.
                elseif ( '' == $artist_url )
                {
                    $sub_caption .= $artist_name;
                } // We have both.
                else
                {
                    $sub_caption .= '<a rel="author" href="'
                        . $artist_url . '">'
                        . $artist_name
                        . '</a>';
                }

                $sub_caption .= '</span>';
            }

            $caption .= $sub_caption;
        }

        return '<div ' . $html_id . 'class="wp-caption ' . esc_attr($align)
        . '" style="width: ' . (10 + (int) $width) . 'px">'
        . do_shortcode( $content ) . '<p class="wp-caption-text">'
        . $caption . '</p></div>';
    }

    public function short_url($url, $max_length=20)
    {
        $real_length = mb_strlen($url, 'UTF-8');

        if ( $real_length <= $max_length )
        {
            return $url;
        }

        $keep = round( $max_length / 2 ) - 1;

        return mb_substr($url, 0, $keep, 'UTF-8') . '…'
            . mb_substr($url, -$keep, $real_length, 'UTF-8');
    }
    # @todo uninstall
}

2
สำหรับปลั๊กอินที่ "หยาบ" คุณมีรูปแบบการเข้ารหัสที่ดีมาก ยกนิ้วคู่ขึ้น!
hakre

0

ตอบสนองต่อคำถามของ Drew ในความคิดเห็นคุณสามารถปรับแต่ง HTML สำหรับฟิลด์โดยการตั้งค่าinputสตริงใหม่แล้วเพิ่มสตริงเดียวกันนั้นเป็นกุญแจสำคัญใน$form_fieldsอาร์เรย์

ตามค่าเริ่มต้น WordPress จะยอมรับtextและtextareaเป็นinputประเภทเท่านั้น สิ่งอื่นใดจะต้องมีการกำหนดในลักษณะที่กำหนดเองดังต่อไปนี้ ฉันไม่ได้พยายามทำให้ฟิลด์ฟอร์มคงอยู่ด้วยวิธีนี้ดังนั้นเพื่อให้ประเภทอินพุตอื่นเช่นปุ่มตัวเลือกอาจใช้กลเม็ดพิเศษเล็กน้อย

add_filter( 'attachment_fields_to_edit', 'change_fields', 10, 2 );
function change_fields( $form_fields, $post ) {

    $form_fields["some_new_field"] = array(  
            "label" => __("Type something"),
            "input" => "arbitrary_value",
            "value" => get_post_meta($post->ID, "some_new_field", true),
            "arbitrary_value" => "hello world!"
        );
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.