首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标记数组排序问题

标记数组排序问题
EN

Stack Overflow用户
提问于 2012-10-24 10:17:49
回答 3查看 894关注 0票数 9

2012年10月25日-仍未解决!如下所示:

我的客户有一个WordPress标签云(标签数组),它的标签包括“字符以及一些标签的前缀。即:

代码语言:javascript
复制
"rose"
"autumn"
The Abby
The Cloud
The Elephant

显然,所有包含在引号中的标签都排序在列表的顶部,所有以前缀开头的单词都排序在字母T周围的某个位置。

它撒在我身上:“所有标签(在可湿性粉剂标签云)必须升序,但那些包含”“或字符必须排序与所有其他标签的时间顺序,忽略”和前缀。

我研究了WP的核心函数:

代码语言:javascript
复制
**function wp_generate_tag_cloud**

但我不知道从何说起。在原始SQL语句中,我可以使用trim()过滤掉“”和标记云数组中的字符,但这只是一个想法,我不知道如何应用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-27 03:45:16

wp_generate_tag_cloud()调用名为tag_cloud_sort的筛选器,该筛选器可以覆盖$args参数中指定的排序顺序。tag_cloud_sort过滤器接收一个标记数组和传递给wp_generate_tag_cloud()的实际$args参数,因此它可以检查wp_generate_tag_cloud()调用的完整设置,并相应地调整其行为。

您可以尝试如下所示:

代码语言:javascript
复制
function custom_tag_sort($tags, $args) {
    if ($args['orderby'] != 'name') {
        // do not reorder if sort order is not by name.
        // wp_generate_tag_cloud() is smart enough to notice order
        // is not changed and will proceed with its regular sort logic.
        return $tags;
    }
    uasort($tags, 'custom_tag_sort_compare');
}

function custom_tag_sort_compare($a, $b) {
    return strnatcasecmp(
        custom_tag_sort_normalize($a->name),
        custom_tag_sort_normalize($b->name)
    );
}

function custom_tag_sort_normalize($tag) {
    // strip quote marks
    $tag = trim($tag, '"');
    // strip leading definitive article
    $tag = preg_replace('/^\s*the\s+/i', '', $tag);
    return $tag;
}

add_filter('tag_cloud_sort', 'custom_tag_sort');

免责声明:我只是在粗略检查了一下wp_generate_tag_cloud()函数之后才写这篇文章的。我还没有在实时的WordPress安装上测试它;我只是验证了排序函数在您的示例标记云上是否正常工作:

代码语言:javascript
复制
The Abby
"autumn"
The Cloud
The Elephant
"rose"
票数 4
EN

Stack Overflow用户

发布于 2012-10-24 10:54:13

好的,所以你想避免修改wordpress的核心代码...当你的客户在你告诉他不要这样做后点击更新按钮时,你将不得不进入并再次扰乱它。改用动作钩子。有一个可以方便地连接到标签云函数的输出中。将其添加到主题函数文件中

代码语言:javascript
复制
function tagCloudFilter($tagCloudString, $args)
{
    $tagCloudString = str_replace('The','', $tagCloudString);
    $tagCloudString = str_replace('"','', $tagCloudString);
}

add_filter('wp_tag_cloud', 'tagCloudFilter', 10, 2);

这至少会去掉你不想要的东西。至于对它进行排序,我不确定,但这应该会让你上路。使用jquery对其进行排序可能会更容易

如果您真的想修改核心代码,那么在格式化之前在标记数组中运行一个foreach循环,并在该循环中使用上面的str_replaces。只需在数组上运行sort(),就可以了。但如果是我的话,我会选择半个解决方案,而不是按字母顺序排列,而不是修改wordpress核心

票数 2
EN

Stack Overflow用户

发布于 2012-10-26 23:30:57

这是一个想法:

您可以复制原始的tag_cloud函数并在您的functions.php上创建自己的函数。

您可以进行想要进行的更改,并在函数中添加此过滤器:

代码语言:javascript
复制
$return = apply_filters( 'YOUR_tag_cloud_function', $return, $args );

然后创建前一个过滤器,将您的函数添加到钩子中:

代码语言:javascript
复制
add_filter('wp_tag_cloud', 'YOUR_tag_cloud_function');

我不知道它能不能用,我没有测试它。你认为如何?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13042100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档