ฉันจะเลือกรูปภาพจาก Media Library ในปลั๊กอินของฉันได้อย่างไร


15

ฉันได้เขียนปลั๊กอินในที่ที่คุณมีไอคอนแชทเล็ก ๆ ในมุมขวาด้านล่าง Media Libraryแต่ผมต้องการให้ผู้ใช้สามารถเลือกภาพเป็นไอคอนจากที่ ฉันจะทำสิ่งนี้กับ Wordpress API ได้อย่างไร รูปภาพคือการตั้งค่าในปลั๊กอิน (สามารถเปลี่ยนได้โดยผู้ดูแลระบบเท่านั้น)


2
คุณควรรวมถึงwp.mediaเพื่ออนุญาตให้อัปโหลดที่กำหนดเองเลือกไฟล์สื่อสำหรับข้อกำหนดนี้ WPSE มีตัวอย่างมากมาย แต่บางทีโพสต์นี้อาจช่วยคุณได้jeroensormani.com/และคุณจะพบกับตัวอย่าง github โดยเฉพาะจาก ocean90 - github.com/ocean90/media-modal-demo
bueltge

คำตอบ:


19

คุณควรใช้wp.mediaเพื่อใช้กล่องโต้ตอบ WordPress Media Manager

ก่อนอื่นคุณต้องทำการเข้าคิว scritps:

// As you are dealing with plugin settings,
// I assume you are in admin side
add_action( 'admin_enqueue_scripts', 'load_wp_media_files' );
function load_wp_media_files( $page ) {
  // change to the $page where you want to enqueue the script
  if( $page == 'options-general.php' ) {
    // Enqueue WordPress media scripts
    wp_enqueue_media();
    // Enqueue custom script that will interact with wp.media
    wp_enqueue_script( 'myprefix_script', plugins_url( '/js/myscript.js' , __FILE__ ), array('jquery'), '0.1' );
  }
}

HTML ของคุณอาจเป็นแบบนี้ (โปรดสังเกตว่ารหัสของฉันใช้รหัสสิ่งที่แนบมาในการตั้งค่าปลั๊กอินแทน url รูปภาพตามที่คุณทำในคำตอบของคุณฉันคิดว่ามันดีกว่ามากตัวอย่างเช่นการใช้ ID ช่วยให้คุณได้ขนาดภาพที่แตกต่างกัน ต้องการพวกเขา):

$image_id = get_option( 'myprefix_image_id' );
if( intval( $image_id ) > 0 ) {
    // Change with the image size you want to use
    $image = wp_get_attachment_image( $image_id, 'medium', false, array( 'id' => 'myprefix-preview-image' ) );
} else {
    // Some default image
    $image = '<img id="myprefix-preview-image" src="https://some.default.image.jpg" />';
}

 <?php echo $image; ?>
 <input type="hidden" name="myprefix_image_id" id="myprefix_image_id" value="<?php echo esc_attr( $image_id ); ?>" class="regular-text" />
 <input type='button' class="button-primary" value="<?php esc_attr_e( 'Select a image', 'mytextdomain' ); ?>" id="myprefix_media_manager"/>ç

MyScript.js

jQuery(document).ready( function($) {

      jQuery('input#myprefix_media_manager').click(function(e) {

             e.preventDefault();
             var image_frame;
             if(image_frame){
                 image_frame.open();
             }
             // Define image_frame as wp.media object
             image_frame = wp.media({
                           title: 'Select Media',
                           multiple : false,
                           library : {
                                type : 'image',
                            }
                       });

                       image_frame.on('close',function() {
                          // On close, get selections and save to the hidden input
                          // plus other AJAX stuff to refresh the image preview
                          var selection =  image_frame.state().get('selection');
                          var gallery_ids = new Array();
                          var my_index = 0;
                          selection.each(function(attachment) {
                             gallery_ids[my_index] = attachment['id'];
                             my_index++;
                          });
                          var ids = gallery_ids.join(",");
                          jQuery('input#myprefix_image_id').val(ids);
                          Refresh_Image(ids);
                       });

                      image_frame.on('open',function() {
                        // On open, get the id from the hidden input
                        // and select the appropiate images in the media manager
                        var selection =  image_frame.state().get('selection');
                        var ids = jQuery('input#myprefix_image_id').val().split(',');
                        ids.forEach(function(id) {
                          var attachment = wp.media.attachment(id);
                          attachment.fetch();
                          selection.add( attachment ? [ attachment ] : [] );
                        });

                      });

                    image_frame.open();
     });

});

// Ajax request to refresh the image preview
function Refresh_Image(the_id){
        var data = {
            action: 'myprefix_get_image',
            id: the_id
        };

        jQuery.get(ajaxurl, data, function(response) {

            if(response.success === true) {
                jQuery('#myprefix-preview-image').replaceWith( response.data.image );
            }
        });
}

และการกระทำของอาแจ็กซ์เพื่อรีเฟรชตัวอย่างภาพ:

// Ajax action to refresh the user image
add_action( 'wp_ajax_myprefix_get_image', 'myprefix_get_image'   );
function myprefix_get_image() {
    if(isset($_GET['id']) ){
        $image = wp_get_attachment_image( filter_input( INPUT_GET, 'id', FILTER_VALIDATE_INT ), 'medium', false, array( 'id' => 'myprefix-preview-image' ) );
        $data = array(
            'image'    => $image,
        );
        wp_send_json_success( $data );
    } else {
        wp_send_json_error();
    }
}

PD: มันเป็นตัวอย่างรวดเร็วเขียนนี่ขึ้นอยู่กับคำตอบอื่นไม่ได้ทดสอบเพราะคุณไม่ได้ให้ข้อมูลเพียงพอเกี่ยวกับบริบทที่แน่นอนที่จะใช้รหัสหรือปัญหาที่แน่นอนที่คุณมี


2

ใช้wordpress-settings-api-classโดย Tareq Hasan, Url: https://github.com/tareq1988/wordpress-settings-api-class


2
ฉันคิดว่าทางออกที่ไม่มีห้องสมุดเพิ่มเติมจะดีกว่าแข็ง เช่นการควบคุมwp.media
bueltge

1

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

// create the field
add_action( 'show_user_profile', 'wpse_235406_chaticon' );
add_action( 'edit_user_profile', 'wpse_235406_chaticon' );

function wpse_235406_chaticon ($user) { 
    echo '
    <h3>Chat Icon</h3>
    <table class="form-table">
        <tr>
            <th><label for="chaticon">Chat Icon</label></th>
            <td>
                <input type="file" name="chaticon" id="chaticon" value="' . esc_attr (get_the_author_meta ('chaticon', $user->ID)) . '" class="file-upload" /><br />
                <span class="description">Please select your chat icon.</span>
            </td>
        </tr>
    </table>';
}

// save the field
add_action( 'personal_options_update', 'wpse_235406_chaticon_save' );
add_action( 'edit_user_profile_update', 'wpse_235406_chaticon_save' );

function wpse_235406_chaticon_save ($user_id) {
    if (current_user_can ('edit_user', $user_id)) 
        update_usermeta ($user_id, 'chaticon', $_POST['chaticon']);
}

ตอนนี้สิ่งนี้จะช่วยให้คุณสามารถอัปโหลดไฟล์จากคอมพิวเตอร์ของผู้ใช้ หากคุณต้องการให้ผู้ใช้เลือกไฟล์จากภาพที่มีอยู่สิ่งต่าง ๆ มีความซับซ้อนมากขึ้นเพราะคุณต้องเรียกไลบรารีสื่อแทนการอัปโหลดไฟล์เริ่มต้น Steven Slack ได้เขียนบทความที่ยอดเยี่ยมเกี่ยวกับวิธีการทำเช่นนี้ซึ่งฉันไม่ต้องการให้เครดิตโดยการคัดลอกโค้ดของเขาที่นี่

ในแม่แบบของคุณคุณต้องแยกแยะความเป็นไปได้สามประการ: ผู้ใช้ที่ไม่ได้เข้าสู่ระบบผู้ใช้ที่เข้าสู่ระบบ แต่ไม่มีไอคอนผู้ใช้ที่เข้าสู่ระบบและมีไอคอน ประมาณรวมถึง:

$current_user = wp_get_current_user();
if ( 0 == $current_user->ID ) {
  ... do what you want to do for not logged in users ...
  }
else {
  $icon = get_user_meta ($current_user->ID, 'chaticon');
  if (empty($icon)) {
    ... default icon with link to upload possibility ...
    }
  else {
     ... display $icon ...
     }

ไม่ฉันต้องการให้เป็นการตั้งค่าปลั๊กอิน
โทมัส

คุณหมายถึงเฉพาะผู้ดูแลระบบของเว็บไซต์ที่ควรจะสามารถเปลี่ยนไอคอนและมันจะเหมือนกันสำหรับผู้เข้าชม / ผู้ใช้ทุกคน?
cjbj

1
นั่นคงเป็นเรื่องเล็กน้อย นี่คือบทช่วยสอนสำหรับสิ่งนั้น: mikejolley.com/2012/12/21/…
cjbj

ใช่มันปรับแต่งรูปลักษณ์ของปุ่ม
โทมัส

ฉันลองใช้การสอน แต่ไม่ได้ผลสำหรับฉัน (ล้าสมัยหรือไม่) เพราะเฟรมไม่ได้เป็นส่วนหนึ่งของวัตถุ js
โทมัส


0

ฉันใช้โซลูชันนี้ (โดยไม่ใช้ Media Library เอง):

การใช้image-picker-libภายในโมดัลที่ตั้งค่าของอินพุตที่ซ่อนอยู่ซึ่งถูกโพสต์ไปที่ตัวเลือก ด้วยการรับสื่อทั้งหมดและแสดงเป็นตัวเลือกฉันสามารถให้ผู้ใช้เลือก img

HTML

<input id="image" name="image" class="validate" type="image" src="<?php echo esc_attr(get_option('image_url')); ?>" id="image_url" width="48" height="48" />
<br>
<a href="#imageModal" class="waves-effect waves-light btn modal-trigger">
    change
</a>
<input id="image_url" name="image_url" type="text" value="" hidden />

PHP / HTML

<div id="imageModal" class="modal">
    <div class="modal-content">
        <select class="image-picker show-html">
            <option data-img-src="<?php echo CM_PATH . "/img/chat_general.png" ?>"  value="0"></option>
            <?php
            $query_images_args = array(
                'post_type'   => 'attachment',
                'post_mime_type' => 'image',
                'post_status' => 'inherit',
                'posts_per_page' => - 1,
            );

            $query_images = new WP_Query( $query_images_args );
            $i = 1;
            foreach ( $query_images->posts as $image ) {
                ?>
                <option data-img-src="<?php echo wp_get_attachment_url($image->ID); ?>"  value="<?php echo $i; ?>"></option>
                <?php
                $i  ;
            }
            ?>
        </select>
    </div>
    <div class="modal-footer">
        <a class="waves-effect waves-light btn change">Choose</a>
    </div>
</div>
</div>
</div>

JS

 $(".change").on("click", function() {
 +            var url = $(".image-picker > option:selected").attr("data-img-src");
 +            $("#image").attr("src", url);
 +            $("#image_url").attr("value", url);
 +            $("#imageModal").closeModal();
 +        });

ฉันคิดว่าทางออกที่ไม่มีห้องสมุดเพิ่มเติมจะดีกว่าแข็ง เช่นการควบคุมwp.media
bueltge

@ueltge ฉันเห็นด้วย แต่ไม่มีใครตอบได้ตรงและฉันก็ต้องการเวลา ดังนั้นหากมีคนให้คำตอบที่ดีพวกเขาจะได้รับความโปรดปราน!
โธมัส

ฉันเห็นคำตอบของคุณเป็นวิธีแก้ปัญหา แต่ไม่ใช่วิธีที่ดีที่สุด ตอนนี้มันเป็นส่วนหนึ่งของผู้เขียนคำถามคุณ;) เพื่อทำการตัดสินใจ
bueltge

วิธีแก้ปัญหานี้อาจกลายเป็นปัญหาได้อย่างรวดเร็วเมื่อจำนวนรูปภาพเพิ่มขึ้น "ไม่มีใครให้คำตอบที่ตรง" ไม่ใช่ข้อแก้ตัว คำถามของคุณแย่มากคุณจึงได้คำตอบที่ไม่ดี คุณไม่แสดงความพยายามการวิจัยหรือรหัสที่คุณได้ลองเพียงแค่ "ฉันต้องการทำสิ่งนี้ให้โซลูชันที่พร้อมใช้งาน" ซึ่งก็เหมือนกับที่ "ทำงานให้ฉัน" ค้นหา wp.media ตามที่แนะนำ มีตัวอย่างหลายร้อยตัวอย่างใน WPSE หากคุณมีปัญหาในการใช้โพสต์คำถามใหม่เกี่ยวกับมัน
cybmeta

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