如何从我的插件的媒体库中选择图像?

时间:2016-08-09 作者:Thomas

我已经编写了一个插件,其中您在右下角有一个小聊天图标,但是我希望用户能够从Media Library. 如何使用Wordpress API实现这一点?图像是插件中的设置(仅可由管理员更改)

6 个回复
最合适的回答,由SO网友:cybmeta 整理而成

您应该使用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可以是这样的(注意,我的代码在插件设置中使用附件ID,而不是像您在回答中那样使用图像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" />\';
}

  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操作:

// 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:这是一个基于other answer. 未测试,因为您没有提供有关代码将使用的确切上下文或存在的确切问题的足够信息。

SO网友:Rohit Kaushik

易于使用只需将代码复制粘贴到所需位置

<?php
if ( isset( $_POST[\'submit_image_selector\'] ) && isset( $_POST[\'image_attachment_id\'] ) ) :
        update_option( \'media_selector_attachment_id\', absint( $_POST[\'image_attachment_id\'] ) );
    endif;
    wp_enqueue_media();
    ?><form method=\'post\'>
        <div class=\'image-preview-wrapper\'>
            <img id=\'image-preview\' src=\'<?php echo wp_get_attachment_url( get_option( \'media_selector_attachment_id\' ) ); ?>\' width=\'200\'>
        </div>
        <input id="upload_image_button" type="button" class="button" value="<?php _e( \'Upload image\' ); ?>" />
        <input type=\'hidden\' name=\'image_attachment_id\' id=\'image_attachment_id\' value=\'<?php echo get_option( \'media_selector_attachment_id\' ); ?>\'>
        <input type="submit" name="submit_image_selector" value="Save" class="button-primary">
    </form>
<?php
$my_saved_attachment_post_id = get_option( \'media_selector_attachment_id\', 0 );
    ?><script type=\'text/javascript\'>
        jQuery( document ).ready( function( $ ) {
            // Uploading files
            var file_frame;
            var wp_media_post_id = wp.media.model.settings.post.id; // Store the old id
            var set_to_post_id = <?php echo $my_saved_attachment_post_id; ?>; // Set this
            jQuery(\'#upload_image_button\').on(\'click\', function( event ){
                event.preventDefault();
                // If the media frame already exists, reopen it.
                if ( file_frame ) {
                    // Set the post ID to what we want
                    file_frame.uploader.uploader.param( \'post_id\', set_to_post_id );
                    // Open frame
                    file_frame.open();
                    return;
                } else {
                    // Set the wp.media post id so the uploader grabs the ID we want when initialised
                    wp.media.model.settings.post.id = set_to_post_id;
                }
                // Create the media frame.
                file_frame = wp.media.frames.file_frame = wp.media({
                    title: \'Select a image to upload\',
                    button: {
                        text: \'Use this image\',
                    },
                    multiple: false // Set to true to allow multiple files to be selected
                });
                // When an image is selected, run a callback.
                file_frame.on( \'select\', function() {
                    // We set multiple to false so only get one image from the uploader
                    attachment = file_frame.state().get(\'selection\').first().toJSON();
                    // Do something with attachment.id and/or attachment.url here
                    $( \'#image-preview\' ).attr( \'src\', attachment.url ).css( \'width\', \'auto\' );
                    $( \'#image_attachment_id\' ).val( attachment.id );
                    // Restore the main post ID
                    wp.media.model.settings.post.id = wp_media_post_id;
                });
                    // Finally, open the modal
                    file_frame.open();
            });
            // Restore the main ID when the add media button is pressed
            jQuery( \'a.add_media\' ).on( \'click\', function() {
                wp.media.model.settings.post.id = wp_media_post_id;
            });
        });
    </script>

SO网友:mukto90

使用wordpress-settings-api-class Tareq Hasan,网址:https://github.com/tareq1988/wordpress-settings-api-class

包括主类class.settings-api.php 在插件中。(此文件https://github.com/tareq1988/wordpress-settings-api-class/blob/master/src/class.settings-api.php)\'type\' => \'file\' 当您要添加媒体上载程序时。(请参见此示例以更好地理解https://github.com/tareq1988/wordpress-settings-api-class/blob/master/example/procedural-example.php)

SO网友:Overcomer

所以this answer 工作得很好。但为了使其可重用,我将代码转换为函数。所以,要使用这个,你必须首先check this outenqueue 剧本。然后声明wpOpenGallery 像这样:

(function($) {
    $(document).ready(function() {
        const wpOpenGallery = function(o, callback) {
            const options = (typeof o === \'object\') ? o : {};

            // Predefined settings
            const defaultOptions = {
                title: \'Select Media\',
                fileType: \'image\',
                multiple: false,
                currentValue: \'\',
            };

            const opt = { ...defaultOptions, ...options };

            let image_frame;

            if(image_frame){
                image_frame.open();
            }

            // Define image_frame as wp.media object
            image_frame = wp.media({
                title: opt.title,
                multiple : opt.multiple,
                library : {
                    type : opt.fileType,
                }
            });

            image_frame.on(\'open\',function() {
                // On open, get the id from the hidden input
                // and select the appropiate images in the media manager
                const selection =  image_frame.state().get(\'selection\');
                const ids = opt.currentValue.split(\',\');

                ids.forEach(function(id) {
                    const attachment = wp.media.attachment(id);
                    attachment.fetch();
                    selection.add( attachment ? [ attachment ] : [] );
                });
            });

            image_frame.on(\'close\',function() {
                // On close, get selections and save to the hidden input
                // plus other AJAX stuff to refresh the image preview
                const selection =  image_frame.state().get(\'selection\');
                const files = [];

                selection.each(function(attachment) {
                    files.push({
                        id: attachment.attributes.id,
                        filename: attachment.attributes.filename,
                        url: attachment.attributes.url,
                        type: attachment.attributes.type,
                        subtype: attachment.attributes.subtype,
                        sizes: attachment.attributes.sizes,
                    });
                });

                callback(files);
            });

            image_frame.open();
        }
    })
}(jQuery));
这样称呼它:

wpOpenGallery(null, function(data) {
    console.log(data);
});

SO网友:cjbj

由于您希望每个用户的图标都不同,因此必须将图像存储在用户配置文件中。这意味着您需要添加一个额外的用户字段:

// 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 has written an excellent post 如何做到这一点,我不想在这里复制粘贴他的代码。

在模板中,您必须区分三种可能性:用户未登录、用户已登录但没有图标、用户已登录和有图标。大致包括:

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

SO网友:Thomas

我使用了此解决方案(不使用媒体库本身):

使用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();
 +        });

相关推荐