Làm cách nào để chọn hình ảnh từ Thư viện phương tiện trong plugin của tôi?


14

Tôi đã viết một plugin trong đó bạn có một biểu tượng trò chuyện nhỏ ở góc dưới bên phải, tuy nhiên tôi muốn người dùng có thể chọn một hình ảnh làm biểu tượng từ Media Library. Làm cách nào để làm điều này với API Wordpress? Hình ảnh là một cài đặt trong plugin (chỉ có thể thay đổi bởi quản trị viên)


2
Bạn nên bao gồm wp.mediađể cho phép tải lên tùy chỉnh, chọn tệp phương tiện cho yêu cầu này. WPSE có rất nhiều ví dụ, nhưng có lẽ các bài đăng này giúp bạn jeroensormani.com/. Ngoài ra, bạn cũng tìm thấy trên các ví dụ về github, đặc biệt là từ Ocean90 - github.com/ocean90/media-modal-demo
bueltge 17/8/2016

Câu trả lời:


17

Bạn nên sử dụng wp.mediađể sử dụng hộp thoại WordPress Media Manager.

Trước tiên, bạn cần phải ghi danh các 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 của bạn có thể giống như thế này (lưu ý mã của tôi sử dụng ID đính kèm trong cài đặt plugin thay vì url hình ảnh như bạn đã làm trong câu trả lời của mình, tôi nghĩ nó tốt hơn nhiều. Ví dụ: sử dụng ID cho phép bạn có được các kích thước hình ảnh khác nhau khi bạn cần họ):

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

Và hành động Ajax để làm mới bản xem trước hình ảnh:

// 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: đây là một mẫu nhanh được viết ở đây dựa trên câu trả lời khác . Không được kiểm tra vì bạn không cung cấp đủ thông tin về ngữ cảnh chính xác mà mã sẽ được sử dụng hoặc các vấn đề chính xác mà bạn gặp phải.


2

Được sử dụng wordpress-settings-api-classbởi Tareq Hasan, Url: https://github.com/tareq1988/wordpress-sinstall-api- class


2
Tôi nghĩ rằng một giải pháp mà không cần thư viện bổ sung là tốt hơn, vững chắc; Giống như sự wp.mediakiểm soát .
bueltge 17/8/2016

1

Vì bạn muốn biểu tượng khác nhau cho mọi người dùng, bạn sẽ phải lưu trữ hình ảnh trong hồ sơ người dùng. Điều này có nghĩa là bạn cần thêm một trường người dùng:

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

Bây giờ, điều này cung cấp cho bạn khả năng tải lên một tệp từ máy tính của người dùng. Nếu bạn muốn người dùng chọn tệp từ các hình ảnh hiện có, mọi thứ trở nên phức tạp hơn, bởi vì sau đó bạn cần gọi thư viện phương tiện thay vì tải lên tệp mặc định. Steven Slack đã viết một bài đăng tuyệt vời làm thế nào để làm điều này, mà tôi không muốn lấy tín dụng bằng cách sao chép mã của mình ở đây.

Trong mẫu của bạn, bạn phải phân biệt ba khả năng: người dùng chưa đăng nhập, người dùng đăng nhập nhưng không có biểu tượng, người dùng đăng nhập và có biểu tượng. Một cách thô bạo, bao gồm điều này:

$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 ...
     }

không, tôi muốn nó là một cài đặt plugin
Thomas

Bạn có nghĩa là chỉ quản trị viên của trang web mới có thể thay đổi biểu tượng và nó sẽ giống nhau cho mọi khách truy cập / người dùng?
cjbj

1
Điều đó sẽ khá tầm thường. Đây là một hướng dẫn cho điều đó: mikejcar.com/2012/12/21/ Cách
cjbj

vâng, nó tùy chỉnh giao diện (hình ảnh) của một nút
Thomas

Tôi đã thử hướng dẫn, nhưng nó không hoạt động đối với tôi (lỗi thời?) Vì các khung không phải là một phần của đối tượng js
Thomas


0

Tôi đã sử dụng giải pháp này (không sử dụng Thư viện phương tiện):

Sử dụng công cụ chọn hình ảnh-lib bên trong một phương thức đặt giá trị của đầu vào bị ẩn, được đăng lên các tùy chọn. Bằng cách lấy tất cả các phương tiện truyền thông và lặp lại nó dưới dạng tùy chọn, tôi có thể cho phép người dùng chọn một 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>

Mã não

 $(".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();
 +        });

Tôi nghĩ rằng một giải pháp mà không cần thư viện bổ sung là tốt hơn, vững chắc; Giống như sự wp.mediakiểm soát .
bueltge 17/8/2016

@bueltge Tôi đồng ý, nhưng không ai trả lời thẳng và tôi cần thời gian. Vì vậy, nếu ai đó đưa ra một câu trả lời tuyệt vời, họ nhận được tiền thưởng!
Thomas

Tôi thấy câu trả lời của bạn cũng là giải pháp, nhưng không phải là cách tốt nhất. Bây giờ nó là một phần của tác giả câu hỏi, bạn;) để đưa ra quyết định.
bueltge 17/8/2016

Giải pháp này có thể nhanh chóng trở thành một vấn đề khi số lượng hình ảnh tăng lên. "không ai đưa ra một câu trả lời thẳng" không phải là một cái cớ; Câu hỏi của bạn rất kém, vì vậy bạn nhận được câu trả lời kém. Bạn không cho chúng tôi thấy bất kỳ nỗ lực, nghiên cứu hoặc mã nào bạn đã thử, chỉ cần "Tôi muốn làm điều này, đưa ra giải pháp sẵn sàng sử dụng", cũng giống như "thực hiện công việc cho tôi". Tìm kiếm wp.media như đề xuất bueltge; có hàng trăm ví dụ ở đây trong WPSE. Nếu bạn gặp vấn đề khi sử dụng nó, hãy đăng một câu hỏi mới về nó.
cybmeta

@cybmeta Tôi đã thử và đây là attemp tốt nhất của tôi, vì vậy đừng là một ass về nó. Nếu bạn không thích nó, hãy đề xuất một giải pháp tốt hơn.
Thomas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.