Bir müşteri için yapmış olduğum galeri eklentisini paylaşıyorum, belki ihtiyaç duyan vardır böyle bir şeye..

Wordpress yazı ekleme sayfasında yeni bir alan oluşturarak burada postunuza resimler yüklemenizi sağlar.

* Limitsiz resim ekleyebilirsiniz
* Sürükleyip bırakarak sıralamayı değiştirebilirsiniz
* Tek seferde birden çok resim seçebilir/yükleyebilirsiniz

https://github.com/demirdoven/image-...t-in-wordpress
(Burada nasıl kullanılacağını anlattım fakat Türkçe olarak aşağıda da anlatıyorum..)


Kurulum

Önce resim yükleme alanını oluşturalım (meta box)
* Ben "house" adlı custom post type için oluşturdum, siz normal yazılar için yapacaksanız kodlardaki "house" yazan yerleri "post" olarak değiştirin.

function add_gallery_mb(){
add_meta_box(
'post_gallery',
'Gallery',
'gallery_img_func_callback',
'house',
'normal',
'core'
);
}
add_action( 'admin_init', 'add_gallery_mb' );
Resim yükleme alanının ne yapacağını yazalım..

function gallery_img_func_callback(){
wp_nonce_field( basename(__FILE__), 'sample_nonce' );
global $post;
$gallery_data = get_post_meta( $post->ID, 'gallery_data', true );
?>
<div id="dynamic_cont">
    <div id="img_box_container">
    <?php
    if ( isset( $gallery_data['image_url'] ) )
    {
        for( $i = 0; $i < count( $gallery_data['image_url'] ); $i++ )
        {
        ?>
        <div class="gallery_single_row dolu">
          <div class="gallery_area_div image_container ">
            <img class="gallery_img_img" src="<?php esc_html_e( $gallery_data['image_url'][$i] ); ?>" height="55" width="55" onclick="open_media_uploader_image_this(this)"/>
<input type="hidden"
                     class="meta_image_url"
                     name="gallery[image_url][]"
                     value="<?php esc_html_e( $gallery_data['image_url'][$i] ); ?>"
              />
  </div>
          <div class="gallery_area_div">
            <span class="button remove" onclick="remove_img(this)" title="Remove"/><i class="fas fa-trash-alt"></i></span>
          </div>
          <div class="clear" />
</div>
    </div>
        <?php
        }
    }
    ?>
    </div>
    <div style="display:none" id="main_box">
<div class="gallery_single_row">
<div class="gallery_area_div image_container" onclick="open_media_uploader_image(this)">
<input class="meta_image_url" value="" type="hidden" name="gallery[image_url][]" />
</div>
<div class="gallery_area_div">
<span class="button remove" onclick="remove_img(this)" title="Remove"/><i class="fas fa-trash-alt"></i></span>
</div>
<div class="clear"></div>
</div>
    </div>
    <div id="add_gallery_single_row">
      <input class="button add" type="button" value="+" onclick="open_media_uploader_image_plus();" title="Add image"/>
    </div>
</div>
  <?php
}
Özel script ve stillerimizi sitemizin <head> tagleri arasına yerleştirelim

function gallery_print_func()
{
    global $post;
    if( 'house' != $post->post_type )
        return;
    ?>  
    <style type="text/css">
      .gallery_area_div {
        float:right;
      }
  .image_container {
float:left!important;
width: 100px;
background: url('https://i.hizliresim.com/dOJ6qL.png');
height: 100px;
background-repeat: no-repeat;
background-size: cover;
border-radius: 3px;
cursor: pointer;
  }
  .image_container img{
height: 100px;
width: 100px;
border-radius: 3px;
  }
      .clear {
        clear:both;
      }
      #dynamic_cont {
        width: 100%;
height: auto;
position: relative;
display: inline-block;
      }
      #dynamic_cont input[type=text] {
        width:300px;
      }
      #dynamic_cont .gallery_single_row {
float: left;
display:inline-block;
width: 100px;
position: relative;
margin-right: 8px;
margin-bottom: 20px;
      }
  .dolu {
  display: inline-block!important;
  }
      #dynamic_cont label {
        padding:0 6px;
      }
  .button.remove {
background: none;
color: #f1f1f1;
position: absolute;
border: none;
top: 4px;
right: 7px;
font-size: 1.2em;
padding: 0px;
box-shadow: none;
  }
  .button.remove:hover {
background: none;
color: #fff;
  }
  .button.add {
background: #c3c2c2;
color: #ffffff;
border: none;
box-shadow: none;
width: 100px;
height: 100px;
font-size: 4em;
  }
  .button.add:hover, .button.add:focus {
background: #e2e2e2;
box-shadow: none;
color: #0f88c1;
border: none;
  }
    </style>
    <script defer src="https://use.fontawesome.com/releases/v5.0.8/js/solid.js" integrity="sha384-+Ga2s7YBbhOD6nie0DzrZpJes+b2K1xkpKxTFFcx59QmVPaSA8c7pycsNaFwUK6l" crossorigin="anonymous"></script>
    <link href = "https://code.jquery.com/ui/1.10.4/themes/ui-lightness/jquery-ui.css" rel = "stylesheet">
    <script defer src="https://use.fontawesome.com/releases/v5.0.8/js/fontawesome.js" integrity="sha384-7ox8Q2yzO/uWircfojVuCQOZl+ZZBg2D2J5nkpLqzH1HY0C1dHlTKIbpRz/LG23c" crossorigin="anonymous"></script>
    <script src = "https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <script type="text/javascript">
        function remove_img(value) {
            var parent=jQuery(value).parent().parent();
            parent.remove();
        }
var media_uploader = null;
function open_media_uploader_image(aaa){
media_uploader = wp.media({
frame:    "post",
state:    "insert",
multiple: false
});
media_uploader.on("insert", function(){
var json = media_uploader.state().get("selection").first().toJSON();
var image_url = json.url;
var html = '<img class="gallery_img_img" src="'+image_url+'" height="55" width="55" onclick="open_media_uploader_image_this(this)"/>';
console.log(image_url);
jQuery(aaa).append(html);
jQuery(aaa).find('.meta_image_url').val(image_url);
});
media_uploader.open();
}
function open_media_uploader_image_this(aaa){
media_uploader = wp.media({
frame:    "post",
state:    "insert",
multiple: false
});
media_uploader.on("insert", function(){
var json = media_uploader.state().get("selection").first().toJSON();
var image_url = json.url;
console.log(image_url);
jQuery(aaa).attr('src',image_url);
jQuery(aaa).siblings('.meta_image_url').val(image_url);
});
media_uploader.open();
}

function open_media_uploader_image_plus(){
media_uploader = wp.media({
frame:    "post",
state:    "insert",
multiple: true
});
media_uploader.on("insert", function(){

var length = media_uploader.state().get("selection").length;
var images = media_uploader.state().get("selection").models

for(var iii = 0; iii < length; iii++){
var image_url = images[iii].changed.url;
var box = jQuery('#main_box').html();
jQuery(box).appendTo('#img_box_container');
var element = jQuery('#img_box_container .gallery_single_row:last-child').find('.image_container');
var html = '<img class="gallery_img_img" src="'+image_url+'" height="55" width="55" onclick="open_media_uploader_image_this(this)"/>';
element.append(html);
element.find('.meta_image_url').val(image_url);
console.log(image_url);
}
});
media_uploader.open();
}
$(function() {
            $("#img_box_container").sortable();
        });
    </script>
<?php
}
add_action( 'admin_head-post.php', 'gallery_print_func' );
add_action( 'admin_head-post-new.php', 'gallery_print_func' );
Resim yükleme alanımızın resimleri kaydetmesini sağlayalım

function properties_save( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
$is_autosave = wp_is_post_autosave( $post_id );
$is_revision = wp_is_post_revision( $post_id );
$is_valid_nonce = ( isset( $_POST[ 'sample_nonce' ] ) && wp_verify_nonce( $_POST[ 'sample_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';

if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}

// Correct post type
if ( 'house' != $_POST['post_type'] ) // here you can set post type name
return;
 
if ( $_POST['gallery'] )
{
// Build array for saving post meta
$gallery_data = array();
for ($i = 0; $i < count( $_POST['gallery']['image_url'] ); $i++ )
{
if ( '' != $_POST['gallery']['image_url'][$i])
{
$gallery_data['image_url'][]  = $_POST['gallery']['image_url'][ $i ];
}
}
 
if ( $gallery_data )
update_post_meta( $post_id, 'gallery_data', $gallery_data );
else
delete_post_meta( $post_id, 'gallery_data' );
}
// Nothing received, all fields are empty, delete option
else
{
delete_post_meta( $post_id, 'gallery_data' );
}
}
add_action( 'save_post', 'properties_save' );
İşte bu kadar...

Gelelim resimleri nasıl kullanacağımıza...

Aşağıdaki kodları single.php'de herhangi bir yere koyduğunuzda resimleriniz art arda görüntülenecektir.

<!--Gallery-->
    <div class="photos">
        <div class="container">
            <h2>Photos</h2>
            <div class="row">
<?php
$postData = get_post_meta( get_the_ID() );
$photos_query = $postData['gallery_data'][0];
$photos_array = unserialize($photos_query);
$url_array = $photos_array['image_url'];
$count = sizeof($url_array);
for( $i=0; $i<$count; $i++ ){ ?>
<div class="img_single_box">
   <img class="gallery-img" src="<?php echo $url_array[$i]; ?>" alt=""/>
</div>
<?php } ?>
    </div>
        </div>
    </div>
<!--/Gallery-->