9

2012 年 10 月 25 日 - 仍未解决!请看下面:

我的客户有一个 WordPress 标签云(标签数组),其标签包括 ["] 字符以及某些标签的 [The] 前缀。即:

"rose"
"autumn"
The Abby
The Cloud
The Elephant

显然,引号 ["] 中的所有标签都排序在列表的顶部,所有以 [The] 前缀开头的单词都排序在字母 [T] 周围的某个位置(遵循逻辑 ASC 顺序)。

我发现:“所有标签(在 WP 标签云中)都必须按升序排序,但那些包含 [" "] 或 [The] 字符的标签必须按时间顺序与所有其他标签一起排序,忽略["] 和 [The] 前缀。

我查看了 WP 核心功能:

**function wp_generate_tag_cloud**

但我不知道从哪里开始。在原始 SQL 语句中,我可能使用 trim() 过滤掉 [" "] 和 [The] 字符形成标签云数组,但这只是我不知道如何应用的想法。

4

3 回答 3

4

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

你可以尝试这样的事情:

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 安装上对其进行测试;我只验证了排序功能在您的示例标签云上正常工作:

The Abby
"autumn"
The Cloud
The Elephant
"rose"
于 2012-10-26T19:45:15.707 回答
2

好的,所以您要避免修改 wordpress 的核心代码...当您的客户在您告诉他不要之后点击更新按钮时,您将不得不再次进入并弄乱它.. 改用动作挂钩。有一个方便的挂钩到标签云功能的输出。将此添加到您的主题函数文件中

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 核心

于 2012-10-24T02:54:12.940 回答
0

这里有一个想法:

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

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

$return = apply_filters( 'YOUR_tag_cloud_function', $return, $args );

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

add_filter('wp_tag_cloud', 'YOUR_tag_cloud_function');

我不知道它是否有效,我没有测试它。你怎么看?

于 2012-10-26T15:30:56.877 回答