нужна помощь для галереи jquery из вложений WordPress - PullRequest
0 голосов
/ 20 декабря 2011

Я хочу создать более конкретную галерею jquery для сайта WordPress клиента!

Идея такова:

  • У нас есть страница "Галерея", которая будет использовать шаблон страницы "Галерея-tpl", скажем!

  • В шаблоне страницы "Gallery-tpl" у меня есть одно большое изображение в заголовке с полным размером первого сообщения вложения!

  • где-то в теле у меня есть

    с неупорядоченным списком всех вложений
  • РАЗМЕР ТУМБАЙЛА!

  • этот список должен быть одним ползунком строки

  • И я хочу, чтобы при нажатии на миниатюры большое изображение в заголовке изменялось при полной версии нажатой кнопки THUMBNAIL

  • Я нашел в этом сообщении Получить вложения к сообщению как получить первое вложение и как получить их все!

    • Я нашел один способ заменить изображения на jQuery.

    • Затем я попытался объединить весь код вместе, но он работает только для одного изображения

вот моя "Галерея-тпл"

    <?php
/**
Template Name: Gallery

original: http://www.rlmseo.com/blog/get-images-attached-to-post/
*/

function bdw_get_first_image() {

    // Get the post ID
    $iPostID = $post->ID;

    // Get images for this post
    $arrImages =& get_children('post_type=attachment&post_mime_type=image&post_parent=' . $iPostID );

    // If images exist for this page
    if($arrImages) {

       // Get array keys representing attached image numbers
       $arrKeys = array_keys($arrImages);

       /******BEGIN BUBBLE SORT BY MENU ORDER************/
       // Put all image objects into new array with standard numeric keys (new array only needed while we sort the keys)
       foreach($arrImages as $oImage) {
          $arrNewImages[] = $oImage;
       }

       // Bubble sort image object array by menu_order TODO: Turn this into std "sort-by" function in functions.php
       for($i = 0; $i < sizeof($arrNewImages) - 1; $i++) {
          for($j = 0; $j < sizeof($arrNewImages) - 1; $j++) {
             if((int)$arrNewImages[$j]->menu_order > (int)$arrNewImages[$j + 1]->menu_order) {
                $oTemp = $arrNewImages[$j];
                $arrNewImages[$j] = $arrNewImages[$j + 1];
                $arrNewImages[$j + 1] = $oTemp;
             }
          }
       }

       // Reset arrKeys array
       $arrKeys = array();

       // Replace arrKeys with newly sorted object ids
       foreach($arrNewImages as $oNewImage) {
          $arrKeys[] = $oNewImage->ID;
       }
       /******END BUBBLE SORT BY MENU ORDER**************/

       // Get the first image attachment
       $iNum = $arrKeys[0];

       // Get the thumbnail url for the attachment
       $sThumbUrl = wp_get_attachment_thumb_url($iNum);

       // UNCOMMENT THIS IF YOU WANT THE FULL SIZE IMAGE INSTEAD OF THE THUMBNAIL
       $sImageUrl = wp_get_attachment_url($iNum);

       // Build the <img> string
       $sImgString = '<a href="' .$sImageUrl . '" class="btw_fullimage">' .
                       '<img src="' . $sImageUrl . '" width="600" height="200" alt="Big Image" title="Big Image" />' .
                    '</a>';

       // Print the image
       echo $sImgString;
    }
}

function bdw_get_images() {

    // Get the post ID
    $iPostID = $post->ID;

    // Get images for this post
    $arrImages =& get_children('post_type=attachment&post_mime_type=image&post_parent=' . $iPostID );

    // If images exist for this page
    if($arrImages) {

       // Get array keys representing attached image numbers
       $arrKeys = array_keys($arrImages);

       /******BEGIN BUBBLE SORT BY MENU ORDER************/
       // Put all image objects into new array with standard numeric keys (new array only needed while we sort the keys)
       foreach($arrImages as $oImage) {
          $arrNewImages[] = $oImage;
       }

       // Bubble sort image object array by menu_order TODO: Turn this into std "sort-by" function in functions.php
       for($i = 0; $i < sizeof($arrNewImages) - 1; $i++) {
          for($j = 0; $j < sizeof($arrNewImages) - 1; $j++) {
             if((int)$arrNewImages[$j]->menu_order > (int)$arrNewImages[$j + 1]->menu_order) {
                $oTemp = $arrNewImages[$j];
                $arrNewImages[$j] = $arrNewImages[$j + 1];
                $arrNewImages[$j + 1] = $oTemp;
             }
          }
       }

       // Reset arrKeys array
       $arrKeys = array();

       // Replace arrKeys with newly sorted object ids
       foreach($arrNewImages as $oNewImage) {
          $arrKeys[] = $oNewImage->ID;
       }
       /******END BUBBLE SORT BY MENU ORDER**************/
       // izpolzvai do ili for
       echo '<ul id="btw_gallery">';
       for($i = 0; $i < sizeof($arrNewImages) - 1; $i++) {

           // Get the first image attachment
           $iNum = $arrKeys[$i];

           // Get the thumbnail url for the attachment
           $sThumbUrl = wp_get_attachment_thumb_url($iNum);

           // UNCOMMENT THIS IF YOU WANT THE FULL SIZE IMAGE INSTEAD OF THE THUMBNAIL
           $sImageUrl = wp_get_attachment_url($iNum);

           // Build the <img> string
           $sImgString = '<img src="' . $sThumbUrl . '" alt="Thumbnail Image" title="Thumbnail Image" class="btw_thumb" />';

           // Print the image
           echo '<li>'.$sImgString.'</li>';
       } 
       echo '</ul>';
       echo '
       <script>
        $("#btw_gallery li img").live("click", function() {
            $("a.btw_fullimage").attr("href", \''.$sImageUrl.'\').attr("title", this.title);
           $(".btw_fullimage img").attr("src", \''.$sImageUrl.'\').attr("alt", this.alt).attr("title", this.title);
        });
        </script>
       ';
    }
}

get_header(); ?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

        <div id="primary">
            <div id="content" role="main">

                <?php while ( have_posts() ) : the_post(); ?>

                    <?php bdw_get_first_image(); ?>

                    <?php get_template_part( 'content', 'page' ); ?>

                    <?php bdw_get_images(); ?>
                <?php endwhile; // end of the loop. ?>

                <hr />



            </div><!-- #content -->
        </div><!-- #primary -->


<?php get_footer(); ?>

Я уверен, что есть более правильный и профессиональный способ сделать это, и это сработает!

Если кто-то может мне помочь с этим, пожалуйста, ответьте мне!

1 Ответ

0 голосов
/ 21 декабря 2011

Основная проблема заключается в том, что ваш скрипт жестко кодирует URL-адрес изображения в javascript до последнего изображения, на которое вы ссылались в цикле ($sImageUrl установлено в вашем цикле for). Посмотрите на источник сгенерированной страницы, если вы не понимаете, о чем я.

В качестве общего подхода я бы использовал логику обмена изображениями на простой странице HTML, а затем применил бы ее к WordPress.

к специфике: Я бы избавился от пузыря. Это не повлияет на ваш вывод, но упростит ваш код. Согласно кодексу для get_children , аргументы такие же, как get_posts , который в свою очередь использует WP_Query , который имеет параметры orderby и order , Это предполагает, что вы хотите, чтобы они сортировались таким образом - я заметил, что сортировка пузырьков происходит со страницы, на которую вы ссылались.

WordPress поставляется с копией jQuery - поместив ее в свой шаблон, вы можете без необходимости включать его дважды или хуже, включая две конфликтующие версии. Проверьте функцию wp_enqueue_script и вызовите ее в хуке действия wp_enqueue_scripts в вашем functions.php. Потому что это в комплекте с WordPress, wp_enqueue_script('jquery'); должно быть достаточно. Кроме того, если вы хотите использовать версию Google (неплохая идея), вы можете использовать плагин Use Google Libraries .

Я бы однажды получил вложения и использовал результаты в двух функциях. WordPress выполняет больше работы, чем нужно (возможно, выполняет два одинаковых запроса к базе данных).

Я бы, наверное, показал бы и эскиз для отображаемого изображения. Это упростит логику отображения (вам не придется менять эскиз старого основного изображения на место нового).

Я убрал жестко запрограммированные значения ширины и высоты на изображениях (только для моего тестирования). Вы можете посмотреть функцию wp_get_attachment_image_src , если хотите установить их динамически.

Я не эксперт по jQuery (без сомнения, есть более подходящие подходы, чем "onclick", который пуристы не добавят в HTML), но мне подходит следующее.

В functions.php:

add_action('wp_enqueue_scripts', 'so_enqueue_scripts');

function so_enqueue_scripts() {
    wp_enqueue_script('jquery');
}

и в вашем файле шаблона:

<?php
/**
 Template Name: Gallery

original: http://www.rlmseo.com/blog/get-images-attached-to-post/
*/

function so_get_attached_images($post_id) {
    return get_children( array(
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'post_parent' => $post_id,
        'orderby' => 'menu_order',
        'order' => 'ASC'
    ) );
}

function so_show_first_image($image) {
    $sImageUrl = wp_get_attachment_url($image->ID);
    $sImgString = '<a href="'.$sImageUrl.'" class="btw_fullimage">'.'<img src="'.$sImageUrl.'" alt="Big Image" title="Big Image" />'.'</a>';
    echo $sImgString;
}


function so_show_thumbnails($images) {
    if (empty($images)) {
        return;
    }

    echo '<ul id="btw_gallery">';

    foreach($images as $image) {
        $sThumbUrl = wp_get_attachment_thumb_url($image->ID);
        $sImageUrl = wp_get_attachment_url($image->ID);

        $sImgString = '<a href="#" onclick="setImage(\''.$sImageUrl.'\'); return false;"><img src="'.$sThumbUrl.'" alt="Thumbnail Image" title="Thumbnail Image" class="btw_thumb"/></a>';

        echo '<li>'.$sImgString.'</li>';
    }

    echo '</ul>';

}

get_header();
?>
    <script>
        function setImage(sImageUrl) {
            jQuery("a.btw_fullimage").attr("href", sImageUrl ).attr("title", this.title);
            jQuery(".btw_fullimage img").attr("src", sImageUrl ).attr("alt", this.alt).attr("title", this.title);
        }
    </script>
    <div id="primary">
        <div id="content" role="main">
            <?php while (have_posts()) :
                the_post();
                $images = so_get_attached_images($post->ID);
                if (! empty($images)) {
                    $first_image = current($images); // first image from the array
                    so_show_first_image($first_image);
                }
                get_template_part('content', 'page');
                so_show_thumbnails($images);

             endwhile; // end of the loop. ?>
            <hr />
        </div><!-- #content -->
    </div><!-- #primary -->
<?php
get_footer();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...