WP多站点上每个类别的档案

时间:2014-03-18 作者:tadywankenobi

我正在为一个客户开发一个多语言网站。我发现最简单的方法(免费)是使用WordPress多站点语言切换器(http://lloc.de/msls). 我在这个网站上工作了一段时间,一直都很好。

我需要包含一个通用模板,以允许客户端将各种页面设置为列表页面。我通过根据标题获取类别ID来实现这一点。从这里,我列出了该类别的相关帖子。到目前为止还不错。

在页面的顶部,我必须为该类别的档案添加一个年份下拉列表。这在设计早期就已包括在内,未经咨询,客户坚持希望这一点落实到位。

我使用了一个名为“kwebble”的插件(http://kwebble.com/projects/wp-plugin-afac) 之前,虽然不再支持,但它运行良好,解决了许多问题,并且肯定可以在标准的单站点安装上运行。

我现在的问题是,在我的归档页面上,我需要检测与源类别相关的类别。我曾尝试在页面上输出该类别,但没有任何押韵或理由。如果我选择2014,我会得到一个类别(与当前无关)。如果我选择2013,我会得到一个不同的类别(同样不相关)。一直以来,这些归档页面都位于URL:domain下。com/blog/2014等等。如果URL中没有/blog/我似乎也无法让它工作。

我完全不知道如何继续下去。不幸的是,我不能显示该网站,因为它的客户端隐私受到保护,但如果有帮助,我可以提供任何代码的示例。

任何帮助都将不胜感激。

1 个回复
SO网友:tadywankenobi

我想我应该告诉你我是怎么解决的。

在与同事讨论后,他指出,在url中添加后续年份不会影响显示的页面(我还没来得及找出原因),因此:

/类别/子类别/2011/

显示与相同的页面

/类别/子类别/

这意味着我可以解析url并从中提取年份,然后将其添加到查询中。

我将其添加到标题中以解析url(我确信有更有效的方法,但这对我来说效果很好):

$current = $_SERVER[\'REQUEST_URI\']; // get the url

$parts = explode(\'/\',$current); // break the url down into parts
$parts = array_slice($parts, 1, -1); // for some reason, first and last array items were blank, so trim them

$pattern = "/\\d{4}/"; // set the pattern to match a 4 digit number
$last = end($parts); // get the last item in the array
$year = \'\'; // set the year variable to be empty

if(preg_match($pattern, $last)) {  // test the last array item against the 4 digit pattern
    $year = $last; // if it is a number, then set the year variable to that value
    $parent_parts = array_slice($parts, 0, -1); // as I need this to work with both the url having a number at the end and on the parent page too (without a year in the URL), make the parent part path by trimming out the year component

    $parent = implode(\'/\',$parent_parts); // remake the url parts
    $parent = \'/\'.$parent.\'/\';  // add leading and trailing slashes
} else {
    $parent = $current;  // if the test doesn\'t find a year, just set the parent to the REQUEST_URI
}
这可能看起来过于复杂,但逻辑是可行的。如果我在以下地点进行为期一年的测试:

/类别/子类别/

我需要代码来知道如何处理这个位。因为我总是需要url的这一部分,如果url是:

/类别/子类别/2011/

我需要把2011年从中删掉。这一点在更深的地方变得更加明显。

我将标题显示更改为:

<h2><?php the_title(); ?></h2>
收件人:

<h2><?php echo get_the_title();
if($year !== \'\'){
    echo \': Archives \'.$year;
}
?></h2>
这只是意味着在父页面上,我输出标题,在年份子页面上,我可以在其末尾添加“:Archives 2011”,使其看起来像一个合适的归档文件。

我在页面顶部有一个年度下拉列表。以前这是用wp\\u get\\u归档填充的,但我现在已经放弃了。现在,我需要有一个名为“All”的第一个项目,它将恢复到父级,完整的帖子列表,下拉列表中的每个后续项目都是一年。

<select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;"> // standard wp_get_archives dropdown jump functionality
        <option value="<?php echo get_bloginfo(\'url\'); ?><?php echo $parent; ?>">All</option> // the "All" option, with the parts formulating the url
        <?php
        $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts ORDER BY post_date DESC"); // getting a list of years for all the posts in the category
        foreach($years as $list_year) : 
        if($list_year == $year) {
            $select = \' selected="selected"\'; // ensures that the current year stays selected
        } else {
            $select = \'\';
        } ?>

        <option value="<?php echo get_bloginfo(\'url\'); ?><?php echo $parent; ?><?php echo $list_year; ?>/"<?php echo $select; ?>><?php echo $list_year; ?></option> // populates the option field
        <?php endforeach; ?>
</select>
非常简单的东西。我从以下网站获得了大部分下拉代码:http://wordpress.org/support/topic/archives-by-year-this-is-different

我可能需要在MySQL查询中添加一个类别组件。

最后,我更改了WP\\u查询,以包含一个year属性。由于在选择父页时此选项为空,因此默认为最新日期。否则,仅显示所选年份:

$paged = get_query_var( \'paged\' ) ? get_query_var( \'paged\' ) : false;
$args = array(\'cat\' => $cat, \'posts_per_page\' => \'10\', \'paged\' => $paged, \'year\' => $year );
$query = new WP_Query($args);
为了更好地衡量,我在页面中留下了我与wp\\u pagenavi插件一起使用的页面。

这里的教训是WordPress多站点归档令人震惊。DIY更好。我希望这能帮助其他人。

UPDATE: 在这方面遇到了分页的主要问题。虽然正在研究解决方案,但似乎没有简单的方法来解决这个问题。WordPress似乎无法很好地处理特定类别的归档和分页。

结束

相关推荐

是否使用wp_LIST_CATEGORIES在INCLUDE参数中包含名称或插件?

我在本地和远程工作,通过git推送代码。我在下面设置了当前代码,它查找标记并使用wp_list_categories. 我需要使用include 参数,因为没有带标记的层次结构(在此实例中我不能使用类别)。然而,由于我在本地和远程工作,从本地到远程的ID可能会不一样。因此,理想情况下,我想包括name 或slug, 但我知道include 参数仅允许ID。有没有办法包括name 或slug 在include 参数想法:我的朋友说我们可以有一个名字列表,然后循环遍历所有名字,然后使用get\\u term\