2016-07-01 3 views
1

通常の方法でカスタム化されたカスタム列をタクソノミでソートしようとしましたが、値がシリアライズされた配列として格納され、もの。シリアライズされた配列として保存されたカスタムタクソノミー列を並べ替える

私はknowledgebase_categoryタクソノミーのknowledgebaseカスタムポストタイプを作成しました。

私はknowledgebase_category_edit_form_fieldsknowledgebase_category_add_form_fieldsフックを使用して、カテゴリの順序フィールドを追加し、これがシリアル化された配列として値を格納する

add_action ('edited_knowledgebase_category', 'mytheme_save_extra_knowledgebase_category_fileds'); 
add_action ('created_knowledgebase_category', 'mytheme_save_extra_knowledgebase_category_fileds'); 

if (! function_exists('mytheme_save_extra_knowledgebase_category_fileds')){ 
    function mytheme_save_extra_knowledgebase_category_fileds($term_id) { 
     if (isset($_POST['Cat_meta'])) { 
      $t_id = $term_id; 
      $cat_meta = get_option("category_$t_id"); 
      $cat_keys = array_keys($_POST['Cat_meta']); 
      foreach ($cat_keys as $key){ 
       if(isset($_POST['Cat_meta'][$key])){ 
        $cat_meta[$key] = $_POST['Cat_meta'][$key]; 
       } 
      } 
      update_option("category_$t_id", $cat_meta); 
     } 
    } 
} 

を使用してそれらを保存しました。 optionsの値は次のようになります

a:1:{s:9:"cat_order";s:1:"3";} 
a:1:{s:9:"cat_order";s:2:"34";} 
a:1:{s:9:"cat_order";s:1:"8";} 
a:1:{s:9:"cat_order";s:2:"21";} 
a:1:{s:9:"cat_order";s:2:"67";} 
a:1:{s:9:"cat_order";s:1:"6";} 

ソートは難しいです。

私は私の列を作り、

add_filter('manage_edit-knowledgebase_category_columns', 'mytheme_cat_order_column', 10, 2); 

if (!function_exists('mytheme_cat_order_column')) { 
    function mytheme_cat_order_column($cat_columns){ 
     $cat_columns['cat_order'] = esc_attr__('Category Order', 'mytheme'); 
     return $cat_columns; 
    } 
} 


add_filter ('manage_knowledgebase_category_custom_column', 'mytheme_manage_knowledgebase_category_custom_fields', 10,3); 

if (!function_exists('mytheme_manage_knowledgebase_category_custom_fields')) { 
    function mytheme_manage_knowledgebase_category_custom_fields($deprecated, $column_name, $term_id){ 
     if ($column_name == 'cat_order') { 
      $cat_meta = get_option("category_$term_id"); 
      if (isset($cat_meta['cat_order']) && $cat_meta['cat_order'] != '') { 
       echo intval($cat_meta['cat_order']); 
      } 
     } 
    } 
} 


add_filter('manage_edit-knowledgebase_category_sortable_columns', 'mytheme_manage_knowledgebase_category_sortable_columns'); 

if(!function_exists('mytheme_manage_knowledgebase_category_sortable_columns')){ 
    function mytheme_manage_knowledgebase_category_sortable_columns($columns){ 
     $columns['cat_order'] = esc_attr__('Category Order', 'mytheme'); 
     return $columns; 
    } 
} 

それはソート可能そして私は今、私は、クエリが

をキャストせずに返すべきであるかを確認しようとしたこの

add_filter('terms_clauses', 'mytheme_cat_order_orderby', 10, 3); 

if (!function_exists('mytheme_cat_order_orderby')) { 
    function mytheme_cat_order_orderby($pieces, $taxonomies, $args) { 

     $orderby = isset($_REQUEST['orderby']) ? trim(wp_unslash($_REQUEST['orderby'])) : 'Category Order'; 
     $order = isset($_REQUEST['order']) ? trim(wp_unslash($_REQUEST['order'])) : 'DESC'; 
     $trm = '"'; 

     if($orderby == 'Category Order') { 
      $pieces['join'] .= " INNER JOIN wp_options AS opt ON opt.option_name = concat('category_',t.term_id)"; 
      $pieces['orderby'] = "ORDER BY CAST((SUBSTRING_INDEX(SUBSTRING_INDEX(opt.option_value,';',2),':',-1)) AS UNSIGNED)"; 
      $pieces['order'] = $order; 
     } 

     return $pieces; 

    } 
} 

を使用して、それを並べ替えてみました

SUBSTRING_INDEX(SUBSTRING_INDEX(opt.option_value,';',2),':',-1) 

部分ですが、エラーが発生しました。おそらく、私の周りに"" number(私はthis questionを参考にして、PHPでテストしています)。だから私はCASTを使って値を整数にしようとしました。

ここで列をクリックしてソートすると、何も起こりません。

この混乱(シリアル化された配列)をソートすることは可能ですか?

答えて

0

私はWordPress 4.4のリリース以来、用語メタがあることに気付きました。だから私は、アップデートに私のコードを変更し、このような長期的なメタに追加フィールドを設定します。

add_action ('created_knowledgebase_category', 'mytheme_save_extra_knowledgebase_category_fileds'); 

if (! function_exists('mytheme_save_extra_knowledgebase_category_fileds')){ 
    function mytheme_save_extra_knowledgebase_category_fileds($term_id) { 
     if (isset($_POST['cat_order'])) { 
      $cat_order = intval($_POST['cat_order']); 
      add_term_meta($term_id, 'cat_order', $cat_order, true); 
     } 
    } 
} 

は同様に私はedited_knowledgebase_categoryフックを修正しました。また、用語のメタを追加する機能は、次のようになります。

add_action ('knowledgebase_category_edit_form_fields', 'mytheme_extra_knowledgebase_category_fields'); 

if (! function_exists('mytheme_extra_knowledgebase_category_fields')){ 
    function mytheme_extra_knowledgebase_category_fields($term) { 
     $cat_order = get_term_meta($term->term_id, 'cat_order', true); 
     ?> 
     <tr class="form-field"> 
      <th scope="row" valign="top"><label for="cat_order"><?php esc_attr_e('Category order', 'mytheme'); ?></label></th> 
      <td><input type="text" name="cat_order" for="cat_order" id="cat_order" value="<?php echo intval($cat_order); ?>"></td> 
     </tr> 
    <?php 
    } 
} 

私はtermmetaテーブルから情報を引っ張っていますので。新しいフィールドを作成するときは、入力を空のままにしておきます(空でなければなりません。これは選択の場合とは異なります - 詳細はhereを参照してください)。今

それがソートされている名前は、(単純化のために)ちょうどcat_orderであるように私は、私は私のソート可能な列を更新することによってソートするに明確なデータを持っているので

add_filter('manage_edit-knowledgebase_category_sortable_columns', 'mytheme_manage_knowledgebase_category_sortable_columns'); 

if(!function_exists('mytheme_manage_knowledgebase_category_sortable_columns')){ 
    function mytheme_manage_knowledgebase_category_sortable_columns($sortable){ 
     $sortable['cat_order'] = 'cat_order'; 
     return $sortable; 
    } 
} 

とソート本当に簡単ですその後:

/** 
* Custom column sortable query 
* 
* @param array $pieces  Terms query SQL clauses. 
* @param array $taxonomies An array of taxonomies. 
* @param array $args  An array of terms query arguments. 
* @return string   Modified query 
* @since 1.0.0 
*/ 

add_filter('terms_clauses', 'mytheme_filter_custom_terms', 10, 3); 

if (!function_exists('mytheme_filter_custom_terms')) { 
    function mytheme_filter_custom_terms($pieces, $taxonomies, $args) { 

     global $wpdb; 

     $orderby = isset($_REQUEST['orderby']) ? trim(wp_unslash($_REQUEST['orderby'])) : 'cat_order'; 
     $order = isset($_REQUEST['order']) ? trim(wp_unslash($_REQUEST['order'])) : 'DESC'; 

     if($orderby == 'cat_order') { 
      $pieces['fields'] .= ", tm.*"; 
      $pieces['join'] .= " INNER JOIN {$wpdb->termmeta} AS tm ON tt.term_id = tm.term_id"; 
      $pieces['orderby'] = "ORDER BY ABS(tm.meta_value)"; 
     } 

     return $pieces ; 

    } 
} 

まずあなたがに参加し、その後、あなたが作成した新しい列で注文している場合、その後、あなたは$pieces['fields']配列にクエリのSELECT部分に新しいフィールドを追加する必要がありますチェック正しい番号term_idのテーブルを開き、meta_valueで注文してください。

私はここで整数値を扱っているので、私はABS()を使用しなければなりませんでした。 CAST(tm.meta_value AS int)を使用しようとしましたが、エラーが発生し、ABS()が機能します。これに関する唯一の「悪い点」は、負の整数を使用できないということです。絶対値は正の整数になりますが、回避するには負の値を使用しないことです。D

これは、整数値を含む列、orderby部分を変更する他の値については要点は同じですが、termmeta表にタクソノミのメタ値を格納する方が、オプション表の直列化配列よりも優れています。最初に、それは連載されていません、分類学からあなたの言葉を削除すると削除されます);

これは誰かがこの問題につまずいているのを助けてくれるでしょう:)

関連する問題