【发布时间】:2016-11-03 23:00:16
【问题描述】:
我试图按照通常的方法在分类学中对我的自定义列进行排序,但后来我注意到该值作为序列化数组存储在我的选项表中,而且……这很复杂。
我使用knowledgebase_category 分类创建了一个knowledgebase 自定义帖子类型。
我使用 knowledgebase_category_edit_form_fields 和 knowledgebase_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 )
部分,但我遇到了一个错误,这可能是因为我的号码周围有""(我使用this question 作为参考并仅在php 中对其进行测试得出的结论)。所以我使用CAST 尝试将值转为整数。
现在,当我单击列对其进行排序时,什么也没有发生。
是否可以对这个乱七八糟的东西进行排序(序列化数组)?
【问题讨论】:
标签: php mysql wordpress sorting serialization