2011-01-07 11 views
4

目的:私は、訪問者がドロップダウンメニューから月と年を選択し、内容(投稿)を持つことができる動的なページを作りたいと思います。選択した値に応じてページが変化します。WordPressの投稿を動的にフィルタリングする(PHPとajaxを使用)

私は現在、特定の月と年の特定のカテゴリの投稿を表示するために次のコードを使用しています。

<?php query_posts("cat=3&monthnum=12&year=2011"); ?> <?php if (have_posts()) : ?> 
    <ul> 
    <?php while (have_posts()) : the_post(); ?> 
     <li> 
      <?php the_title(); ?> 
      <?php the_excerpt(); ?> 
     </li> 
    <?php endwhile; ?> 
    </ul><?php endif; ?> 

それはうまく動作しますが、私は訪問者がドロップダウンメニューから月と年を選択し、選択した値に従ってコンテンツの変更を持つことができるように、ページを動的にしたいと思います。私はそれがここでどのように働くかの写真を投稿しました:fivepotato.com/images/ex1.png とfivepotato.com/images/ex2.png。この作品を作るために

、私は、ドロップダウンリストから取られmonthnum変数(の値にする必要がありますことを知っている:

<?php $monthvar = $_POST["month"]; query_posts("cat=3&monthnum=$monthvar&year=2011");?> 

は、私はAjaxで多くの経験を持っていないが、私は月に一度は、ドロップダウンメニューから選択されたコンテンツの再フィルタを作ってそれを使用する必要がありますと仮定し、私は次のサイトで同様の問い合わせを発見した

:。 askthecssguy.com/2009/03/checkbox_filters_with_jquery_1を.html

そして私は、私がしたいと思っているものに似た実際の例を見つけました。http://www.babycarers.com/search?ajax=0&searchref=37609&start=0&lat=&lon=&city=&radius=0&spec1=1&spec2=1&spec3=1&spec4=1&spec5=1&spec6=1&spec7=1&inst1=1&inst2=1&inst3=1&inst4=1&inst5=1&inst6=1&inst7=1&minfee=any&maxfee=any&av1=1&keywords=&country=CA&sort=fee&resultsperpage=10

誰かがこれを取り除くために必要なjavascript/Ajaxで私を助けてくれたら、私は大いに感謝します。

答えて

8

約1,000件の再生回数であり、1つのコメントではありません。まあ、私もこれを必要とし、それを作ることにしました。私は遠く離れた将来の人々のために、以下のJavaScriptとWordpressのコードを共有しました。それは多くのように見えますが、それは後で.extendで使用できるいくつかのjQuery関数を定義したためです。 CSSクラス.content-filterselect要素(ドロップダウン)を探しているだけです。

見つかったら、ドロップダウンのIDを使用してGET変数を現在選択されている値に設定し、同じURLにリダイレクトしてこれらのGET変数を追加します。たとえば、ドロップダウンのIDがproduct_filterで、値がdateに設定されている場合は、GET変数product_filter=dateが設定されます。あなたのワードピースの詳細を気にしないのですばらしいです - 気になるのはselect要素です。

// A bunch of helper methods for reading GET variables etc from the URL 
jQuery.extend({ 
    urlGetVars : function() { 
     var GET = {}; 
     var tempGET = location.search; 
     tempGET = tempGET.replace('?', '').split('&'); 
     for(var i in tempGET) { 
      var someVar = tempGET[i].split('='); 
      if (someVar.length == 2) { 
       GET[someVar[0]] = someVar[1]; 
      } 
     } 
     return GET; 
    }, 
    urlGetVar : function(name) { 
     return $.urlGetVars()[name]; 
    }, 
    serializeUrlVars : function(obj) { 
     var str = []; 
     for(var p in obj) 
     str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
     return str.join("&"); 
    }, 
    currentUrl : function() { 
     return window.location.href.slice(0,window.location.href.indexOf('?')); 
    } 
}); 

// Adds functionality to filter content using a dropdown 
var ContentFilter = function ($) { 
    $(document).ready(function() { 
     // Return to a scroll position if exists 
     var scroll = $.urlGetVar('scroll'); 
     if (typeof scroll != 'undefined') { 
      $(window).scrollTop(scroll); 
     } 
     // Prepare the filter dropdowns 
     $('.content-filter').each(function(){ 
      var me = $(this); 
      // e.g. content-filter-product 
      var id = me.attr('id'); 
      // Refresh with selected filter on change 
      var refresh = function() { 
       var GET = $.urlGetVars(); 
       GET[id] = me.val(); 
       // Save scroll position, return to this position on load 
       GET['scroll'] = $(window).scrollTop(); 
       var newVar = $.currentUrl() + '?' + $.serializeUrlVars(GET); 
       window.location = newVar; 
      }; 
      me.change(refresh); 
     }); 
    }); 
}(jQuery); 

ここではWordpressコードです。私たちが本当に必要とするのは、ある種のIDでselectを生成し、そのクラスを.content-filterに設定することだけです。このコードは 'post'や 'product'のような投稿タイプを求め、select要素を作成します。それは便宜上GET変数を返し、何も設定されていなければデフォルトは 'newest'になります。 $fields配列は、サポートしたい異なるすべてのorderby valuesを設定します。タイプに応じて、$_GET['product_filter']または$_GET['post_filter']のテンプレートのどこにでもいつでもアクセスできます。つまり、指定したページには1つしか存在できませんが、そうしないと、jQueryはどちらを使用するのかわかりません。カスタムIDや後で好きなものを設定するために、このコードを拡張することができます。

function ak_content_filter($post_type_id = 'post', &$filter_get_value, $echo = TRUE) { 
    $dropdown = '<div class="content-filter-wrapper">'; 
    // The dropdown filter id for this post type 
    $filter_id = $post_type_id.'_filter'; 
    // The actual dropdown 
    $dropdown .= '<label for="'. $filter_id .'">Filter</label><select id="'. $filter_id .'" class="content-filter" name="'. $filter_id .'">'; 
    // The available ways of filtering, to sort you'd need to set that in the WP_Query later 
    $fields = array('date' => 'Newest', 'comment_count' => 'Most Popular', 'rand' => 'Random'); 
    $filter_get_value = isset($_GET[$filter_id]) ? $_GET[$filter_id] : 'newest'; // default is 'newest' 
    foreach ($fields as $field_value=>$field_name) { 
     $dropdown .= '<option value="'. $field_value .'" '. selected($field_value, $filter_get_value, FALSE) .'>'. $field_name .'</option>'; 
    } 
    $dropdown .= '</select></div>'; 
    // Print or return 
    if ($echo) { 
     echo $dropdown; 
    } else { 
     return $dropdown; 
    } 
} 

ここで楽しい部分 - コンテンツページにまとめてください。すべての私たちの仕事は、いくつかの甘いと短いコードで報わ:

// This will fill $product_filter with $_GET['product_filter'] or 'newest' if it doesn't exist 
ak_content_filter('product', $product_filter); 
$args = array('post_type' => 'product', 'orderby' => $product_filter); 
// This is just an example, you can use get_pages or whatever supports orderby 
$loop = new WP_Query($args); 

// OR, to avoid printing: 
$dropdown = ak_content_filter('product', $product_filter, FALSE); 
// ... some code ... 
echo $dropdown; 

私はカスタムポストタイプ「製品」を使用していますが、「ポスト」を使用している場合は、まさにそれを交換してください。誰かがおそらくこれをまだプラグインにしていない場合は、これをプラグインにしてください:P

関連する問題