2011-12-20 61 views
0

我想爲客戶的WordPress的網站創建更具體的jQuery畫廊!需要幫助jQuery的畫廊從wordpress附件

的理念是:

  • 我們有頁 「畫廊」 女巫將使用頁面模板 「畫廊-TPL」,讓我們說!

  • 在頁面模板「Gallery-tpl」我有一個頭像女巫的大圖像是第一篇文章附件的全尺寸!

  • 一些身體在那裏我有< DIV>與所有附件

  • TUMBNAIL SIZE的無序列表!

  • 這個名單必須是一個滑塊

  • 而且我要當點擊縮略圖標頭中的大圖像與點擊的縮略圖的完整版本的改變

  • 我對這個職位Get Attachments to post如何發現獲得第一個附件,以及如何獲得所有這些!

    • 我發現了一種用jQuery替換圖像的方法。

    • 然後我試圖所有代碼結合在一起,但它僅適用於一個圖像

這裏是我的「畫廊-TPL」

<?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(); ?> 

我確信還有更多正確和專業的方式來做到這一點,它會工作!

如果有人能幫助我,請回答我!

回答

0

主要問題是您的腳本將JavaScript中的圖像網址硬編碼到循環中引用的最後一張圖像(在您的for循環中設置了$sImageUrl)。如果您不明白我的意思,請查看生成頁面的來源。

作爲一種常規方法,我將圖像交換邏輯工作在一個簡單的HTML頁面中,然後將其應用到WordPress。

要具體: 我會擺脫泡沫排序。它不會影響你的輸出,但它會簡化你的代碼。根據the codex for get_children,自變量與get_posts相同,後者又使用WP_Query,它具有orderbyorder參數。假設你想讓它們以這種方式排序 - 我注意到這個冒泡排序來自你引用的頁面。

WordPress附帶jQuery副本 - 通過將其放入您的模板中,您可能會不必要地將其包含兩次或更糟,包括兩個相沖突的版本。請查看the wp_enqueue_script function,並在functions.phpwp_enqueue_scripts行動掛鉤中調用它。因爲它與WordPress捆綁銷售, wp_enqueue_script('jquery'); 應該足夠了。另外,如果你想使用Google版本(不是一個壞主意),你可以使用Use Google Libraries插件。

我會檢索附件一次,並在兩個函數中使用結果。你需要讓WordPress做更多的工作(可能運行兩個完全相同的數據庫查詢)。

如果可以的話,我可能還會顯示所顯示圖片的縮略圖。它將簡化顯示邏輯(您不必將舊主圖像的縮略圖切換到新圖像的位置)。

我已經取出了圖像上的硬編碼寬度和高度(僅用於我的測試)。如果您想動態設置它們,您可以查看the wp_get_attachment_image_src function

我不是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(); 
?>