根据每个帖子的元密钥更改帖子顺序

时间:2014-03-05 作者:any_h

我在中有这样的循环定义functions.php:

function artist_list($query) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    // Target the artists page
    if (is_tax(\'artist-category\')) {
        $query->set(\'posts_per_page\', \'-1\');
        $query->set(\'orderby\', \'meta_value\');
        $query->set(\'meta_key\', \'artist_last_name\');
        $query->set(\'order\', \'ASC\');
    }
}
add_action(\'pre_get_posts\', \'artist_list\');
我列出了分类法中的艺术家,并根据他们的姓氏按字母顺序排列。但在某些情况下,艺术家应该按名字的字母顺序排列,这应该在每个帖子的后端进行控制。

在循环开始之前,我需要从帖子中获得信息,我只能在循环中获得它。

我将在后端做一个复选框,用户可以选择如何按字母顺序排列。大致如下:

enter image description here

我应该怎么做?是pre_get_posts 答案是什么?

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

不要试图WP_Query, 或SQL, 这样做。在后端,不保存artist_last_name 保存以下内容artist_sort_name 相反,并相应地将其设置为“名字”或“姓氏”,然后在该规范化键上排序。

有条件地排序WP_Query-- 也就是说,无视我的上述建议WP_Query/SQL 这样做--您需要编写一个过滤器和一些相对复杂的SQL 这可能不会非常有效——也就是说,它可能执行得很慢。

有关类似的问题/答案,请参见以下内容:

https://wordpress.stackexchange.com/a/134001/21376

SO网友:any_h

为了子孙后代,以下是我最终要做的事情。

使用artist_sort_name 用于排序,只需将该字段中的值更改为artist_first_nameartist_last_name (感谢s\\u ha\\u dums的回答)。

我正在使用WPAlchemy 类生成元数据库和自定义字段。我不得不打电话给save_filter 在保存之前运行函数(这是functions.php 文件):

// Save filter function, check the value of alphabetize custom field
// if it\'s set then use first name as sort name
function nd_meta_sort($meta, $post_id) {
    if ($meta[\'alphabetize\'] == "alphabetize") {
        $meta[\'artist_sort_name\'] = $meta[\'artist_first_name\'];
    } else {
        $meta[\'artist_sort_name\'] = $meta[\'artist_last_name\'];
    }
    return $meta;
}
下面是在functions.php:

// Metabox for artists
$custom_metabox_artist = new WPAlchemy_MetaBox(array(
    \'id\'                 => \'artist_custom_meta\',
    \'title\'              => \'Artist Info\',
    \'template\'           => TEMPLATEPATH . \'/assets/meta-artists.php\',
    \'types\'              => array(\'artists\'),
    \'mode\'               => WPALCHEMY_MODE_EXTRACT,
    \'hide_screen_option\' => TRUE,
    \'save_filter\'        => \'nd_meta_sort\' // This get executed when saving the post
));
这是实际的代谢箱:

<table>
    <tbody>
        <tr>
            <th>
                <label>First Name:</label>
            </th>
            <td>
                <!-- Field for the first name -->
                <?php $mb->the_field(\'artist_first_name\'); ?>
                <input name="<?php $mb->the_name(); ?>" class="artist-name" type="text" value="<?php $mb->the_value(); ?>">
                <!-- Checkbox for for choosing which field to sort -->
                <span>
                    <?php $mb->the_field(\'alphabetize\'); ?>
                    <input type="checkbox" name="<?php $mb->the_name(); ?>" value="alphabetize" <?php $mb->the_checkbox_state(\'alphabetize\'); ?>>
                    Alphabetize First Name
                </span>
            </td>
        </tr>
        <tr>
            <th>
                <label>Lastname:</label>
            </th>
            <td>
                <!-- Field for the last name -->
                <?php $mb->the_field(\'artist_last_name\'); ?>
                <input name="<?php $mb->the_name(); ?>" class="artist-name" type="text" value="<?php $mb->the_value(); ?>">
            </td>
        </tr>
    </tbody>
</table>
<!-- The field the post are sorted to. Note that it\'s hidden -->
<?php $mb->the_field(\'artist_sort_name\'); ?>
<input name="<?php $mb->the_name(); ?>" class="artist-name sort-name" type="hidden" value="<?php $mb->the_value(); ?>">
Thetable 这并不是强制性的,只是标签/字段pare通常在WP后端显示的方式。

它看起来像这样:

enter image description here

为了完整起见,这是一个让艺术家们着迷的循环。我正在使用pre_get_posts 在里面functions.php:

function artist_list($query) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    // Target the artists page
    if (is_tax(\'artist-category\')) {
        $query->set(\'posts_per_page\', \'-1\');
        $query->set(\'orderby\', \'meta_value\');
        $query->set(\'meta_key\', "artist_sort_name");
        $query->set(\'order\', \'ASC\');
    }
}
add_action(\'pre_get_posts\', \'artist_list\');

结束

相关推荐

Multiple loops in Genesis

所以我想在我的主页上创建两个循环。一个可以显示页面自身内容的页面,然后在其正下方有一个网格循环,用于从“新闻”类别中获取两篇最新帖子。我真的找不到一种方法来做这件事,所以我四处黑客攻击,直到我让它工作起来,但我不确定这是正确的做法,有人能告诉我我可以/应该对这段代码做些什么改进吗?以下是我的截图:http://s18.postimg.org/knrq6sert/2013_11_13_22_55_58.png主题:MetroTemplate:主页。php//* Add support for Genesis