按自定义字段高效地仅对特定类别进行排序

时间:2012-02-15 作者:JCL1178

我有一个网站,大约有1000个帖子,分布在70或80个类别上。其中一些类别要求帖子按自定义字段排序,其他类别则不要求。

通过定义60多个类别模板文件(例如category-123.php、category-124.php),每个调用都有一个单独的循环文件,我得到了一个可行的解决方案:

get_template_part( \'loop-123\', \'category\' );
然后,loop-123文件运行一个新查询并对其进行正确排序,然后再将其传递给循环:

<?php
$the_query = new WP_Query("cat=123&meta_key=programnumber&orderby=meta_value&order=ASC");
?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
然而,必须有一种比创建60多个文件对更有效的方法来实现这一点。不过,我只是没看到。

2 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

我建议你pre_get_posts 并更改查询,而不是在模板中启动自己的查询(这样可以保持模板整洁,避免数据库查询翻倍!)。

下面演示了这一点,再加上管理中的奖励设置字段(在“阅读”下),以选择“特殊排序”适用的类别-看看设置API到底有多简单!

/**
 * Intercept the query & attach our own parameters if the conditions are met.
 */
function wpse_42457_custom_category_order( $wp_query )
{
    if ( ! $wp_query->is_category() ) // save proceeding processing
        return;

    $special_categories = wp_parse_id_list( get_option( \'sorted_categories\' ) );
    if ( $wp_query->is_category( $special_categories ) ) {

        // We\'ve got a winner - set our special params.
        $wp_query->set( \'meta_key\', \'programnumber\' );
        $wp_query->set( \'orderby\', \'meta_value\' );
        $wp_query->set( \'order\', \'ASC\' );
    }
}
add_action( \'pre_get_posts\', \'wpse_42457_custom_category_order\' );

/**
 * Register the sorted categories option & the settings field.
 */
function wpse_42457_admin_init()
{
    add_settings_field( \'sorted_categories\', \'Special Categories\', \'wpse_42457_setting_field\', \'reading\', \'default\' );
    register_setting( \'reading\', \'sorted_categories\', \'wpse_42457_setting_sanitize\' );
}
add_action( \'admin_init\', \'wpse_42457_admin_init\' );

/**
 * Sanitize our checked categories by turning back to a comma-delimited string.
 *
 * This\'ll save bytes in the options table, plus it can be "unserialized" more
 * efficiently with wp_parse_id_list() when it\'s actually needed.
 */
function wpse_42457_setting_sanitize()
{
    // wp_terms_checklist uses "post_category" POST name.
    if ( isset( $_POST[\'post_category\'] ) )
        $value = $_POST[\'post_category\'];
    else
        $value = array(); // none checked

    return implode( \',\', wp_parse_id_list( $value ) );
}

/**
 * Display the sorted categories field.
 */
function wpse_42457_setting_field()
{
    // Please forgive me for this dirty HTML!
    ?>

<style>#sorted_categories li li { margin: 0 0 0 15px }</style>
<ul id="sorted_categories">
    <?php
        wp_terms_checklist( 0, array(
            \'selected_cats\' => wp_parse_id_list( get_option( \'sorted_categories\' ) ),
            \'checked_ontop\' => false,
            \'taxonomy\' => \'category\'
        ));
    ?>
</ul>

    <?php
}
虽然我总是觉得我应该鼓励其他人为自己采取措施,但事实证明,编写代码要比穿行容易得多——希望这将是一种无教育意义的行为!

你需要把它放到一个自定义插件中,或者你的主题functions.php.

SO网友:Bainternet

如何,在选项表(数据库中)中创建一个选项,其中包含需要自定义排序的类别ID数组,例如:

<?php
$cats_to_sort = array(21,33,43,66); //add as many as you need.
update_option(\'cats_to_sort\',$cats_to_sort);
?>
然后创建单个类别。带有简单循环但在循环之前检查此类别是否需要按自定义字段排序的php文件,例如:

<?php
//get the saved array
$cats_to_sort = get_option(\'cats_to_sort\');
//get the category id, this works for custom taxonomies as well.
$term_slug = get_query_var( \'term\' );
$taxonomyName = get_query_var( \'taxonomy\' );
$term = get_term_by( \'slug\', $term_slug, $taxonomyName );
if (in_array($term->term_id,$cats_to_sort)){
    query_posts("cat=".$term->term_id."&meta_key=programnumber&orderby=meta_value&order=ASC");
}
//you loop here
?>

结束

相关推荐

Custom loop attached to link

我有一个名为公司的自定义帖子类型。当你添加一家新公司时,你需要检查它是否是领导者,所以我创建了带有两个收音机的自定义元数据库,一个表示“是”,另一个表示“否”。在头版中,我通过自定义查询筛选出了领导者我也想在公司档案中进行筛选。我想添加两个链接,“Leaders”和“New”,所以当你按“New”时,你基本上按日期过滤,当你单击“Leaders”时,它按“yes”过滤。我知道我可以用分类法、标签、类别等来做到这一点。。。但对于客户来说,只说“是”或“否”会更简单。因此,我的问题是,当您单击链接时,如何实现