最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

categories - Archives for each category on WP Multisite

programmeradmin1浏览0评论

I'm working on a multilingual site for a client. The easiest way to do this (for free) I found was to use WordPress Multisite Language Switcher (). I've been working on this site for a while and it's been working fine.

I've had a requirement to include a generic template, to allow the client to set various pages as a list page. I do this by getting the category ID on the basis of the title. From here, I list the relevant posts of that category. So far so good.

At the top of the page, I've to include a year dropdown for an archive of that category. This was included early in design without consultation and the client is adamant they want this in place.

I've used a plugin called 'kwebble' () before, which, even though no longer supported, does work well and solves many problems, and definitely works on a standard single site install.

My problem now is that on my archive page, I need to detect the category relating to the category of origin. I have tried outputting the category on the page and it makes no rhyme or reason. If I select 2014, I get one category (unrelated to the current). If I select 2013, I get a different category (again unrelated). All the while, these archive pages are under the URL: domain/blog/2014 etc. I can't seem to get it to work without the /blog/ in the URL either.

I'm completely lost as to how to continue. Unfortunately I can't show the site as it's client privacy protected, but I can give samples of any code if it helps.

Any help would be much appreciated.

I'm working on a multilingual site for a client. The easiest way to do this (for free) I found was to use WordPress Multisite Language Switcher (http://lloc.de/msls). I've been working on this site for a while and it's been working fine.

I've had a requirement to include a generic template, to allow the client to set various pages as a list page. I do this by getting the category ID on the basis of the title. From here, I list the relevant posts of that category. So far so good.

At the top of the page, I've to include a year dropdown for an archive of that category. This was included early in design without consultation and the client is adamant they want this in place.

I've used a plugin called 'kwebble' (http://kwebble/projects/wp-plugin-afac) before, which, even though no longer supported, does work well and solves many problems, and definitely works on a standard single site install.

My problem now is that on my archive page, I need to detect the category relating to the category of origin. I have tried outputting the category on the page and it makes no rhyme or reason. If I select 2014, I get one category (unrelated to the current). If I select 2013, I get a different category (again unrelated). All the while, these archive pages are under the URL: domain/blog/2014 etc. I can't seem to get it to work without the /blog/ in the URL either.

I'm completely lost as to how to continue. Unfortunately I can't show the site as it's client privacy protected, but I can give samples of any code if it helps.

Any help would be much appreciated.

Share Improve this question asked Mar 18, 2014 at 16:26 tadywankenobitadywankenobi 1211 silver badge8 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 1

I thought I'd let you know how I resolved this.

After some discussion with a colleague, he made the point that adding a trailing year to the url, doesn't affect the page displayed (I haven't had time to find out the rationale for this yet) so:

/category/subcat/2011/

displays the same page as

/category/subcat/

This meant that I could parse the url and take the year from it and add it to the query.

I added this to the header to parse the url (I'm sure there are more efficient ways, but this worked well for me):

$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
}

This might seem overly complex for what it does, but the logic works. If I do a test for a year on:

/category/subcat/

I need the code to know what to do with this bit. As I'm always going to need this part of the url, if the url is:

/category/subcat/2011/

I'll need to trim 2011 off of it. This becomes more apparent further down.

I changed the title display from:

<h2><?php the_title(); ?></h2>

to:

<h2><?php echo get_the_title();
if($year !== ''){
    echo ': Archives '.$year;
}
?></h2>

This just means that on the parent page, I output the title and on a year sub-page, I can add in an ": Archives 2011" to the end of it to make it look like a proper archive.

I have a dropdown for the year at the top of the page. Previously this was populated with wp_get_archives, but I've scrapped that now. Now I need to have a first item called "All" which will revert to the parent, full list of posts and each subsequent item in the dropdown is a year.

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

Pretty straightforward stuff. I got most of the dropdown code from: http://wordpress/support/topic/archives-by-year-this-is-different

I probably need to add a category component to the MySQL query.

Finally, I changed the WP_Query, to include a year attribute. As this is left blank when the parent page is selected, it defaults to latest date. Otherwise, it shows just the year selected:

$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);

Just for good measure, I've left in the paging, which I use with the wp_pagenavi plugin.

The lesson here is that WordPress Multisite archiving is appalling. DIY is much better. I hope this helps someone else out there.

UPDATE: Have run into major problems with pagination in this regard. There seems to be no easy way around this, though working on a solution. WordPress just does not seem to play nice with category specific archives AND pagination.

发布评论

评论列表(0)

  1. 暂无评论