Næse for design og kommunikation til nettet
Wordpress som CMS: En sidebar pr. kategori
Opnå mere fleksibilitet i brugen af Wordpress som CMS med én sidebar pr. kategori. Få PHP koden her.
Mange designere og udviklere vælger at bruge Wordpress som CMS fordi det er så enkelt og relativt nemt at implementere og udvikle til. Én af Wordpress’ store begrænsninger i rollen som CMS er imidlertid sidebar-metaforen. Som udgangspunkt er der i de fleste themes kun én eller to sidebars til rådighed sitewide, netop fordi Wordpress er skabt som blogging værktøj. I en blog er det sjældent nødvendigt med flere.
Men har man brug for et decideret CMS, er der behov for relevant sekundært indhold på alle sider. Noget, der relaterer sig til sidens primære indhold og ikke bare en generel liste med kategorier, et arkiv og en blog roll.
Og så fik jeg den ide at man måske kunne opnå noget brugbart, hvis man kunne oprette en sidebar pr. emnekategori. Så ville det være muligt at målrette widget-indhold til de enkelte emner og dermed øge relevansen af sekundært indhold på indlæg og kategorisider. Efter en del eksperimenteren, lykkedes det mig at skrue nedenstående sammen.
Nedenstående kode skal stå i dit themes functions.php fil:
<?php
# Get sidebar names from db.
global $wpdb;
$my_widget_name = $wpdb->get_col("SELECT slug
FROM $wpdb->terms, $wpdb->term_taxonomy
WHERE $wpdb->terms.term_id=term_taxonomy_id
AND taxonomy='category' AND count!=0 ORDER BY name ASC");
# Register one sidebar per category name.
foreach($my_widget_name as $my_widget) {
register_sidebar(array(
'name' => 'Category: ' . $my_widget,
'before_widget' => '<div id="%1$s" class="%2$s widget">',
'after_widget' => '</div>',
'before_title' => '<h3 class="widget-title">',
'after_title' => '</h3>', ));
}
?>
Først opretter vi en forbindelse til databasen, henter kategorinavn og id fra alle kategorier, der ikke er tomme, samt sorterer kategorierne efter navn. Dernæst registrerer vi vores nye sidebars i Wordpress med funktionen register_sidebar samt navngiver hver sidebar med det enkelte kategorinavn.
Indsæt de nye sidebars i dit themes sidebar.php fil:
<?php
# If this is a category archive page.
if (is_category()) {
global $wp_query;
$cat_obj = $wp_query->get_queried_object();
$category_slug = $cat_obj->slug;
}
# If this is a post.
elseif (is_single()) {
$category = get_the_category();
$category_slug = $category[0]->category_nicename;
}
# The widget.
if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar('category_' . $category_slug) ) : ?>
<div id="search" class="widget widget_search">
<h3><?php _e('Search'); ?> <?php bloginfo('name'); ?></h3>
<?php include (TEMPLATEPATH . '/searchform.php'); ?>
</div>
<?php endif; ?>
For at kalde den rigtige sidebar, skal vi have fat i det rigtige kategorinavn. Hvis siden er en kategori-side, kalder vi kategoriens navn. Men hvis siden er et indlæg, kalder vi navnet på den første kategori, siden er gemt i. Nu udskrives kategoriens sidebar, hvis du befinder dig på en kategori-side eller et indlæg.
Hvad så med ’sider’?
Man kan lave noget tilsvarende med Wordpress’ side-metafor. I stedet for at tage fat i kategorierne i databasekaldet, skal man så bare have fat i tilsvarende for ’sider’. I så fald vil databasekaldet se ud som følger:
$page_sidebars = $wpdb->get_col("SELECT post_name
FROM $wpdb->posts WHERE post_type='page'
AND post_status='publish' AND post_parent='0'
ORDER BY menu_order ASC");
Bemærk!
Man skal være forsigtig med metoden, hvis man har mange kategorier og/eller sider, da Wordpress laver et kald til databasen for hver sidebar, den skal loade i backend’en. Skal den lave for mange kald, får man time out og så fungerer metoden naturligvis ikke.
| Print article | This entry was posted by Morten Brunbjerg Bech on 1. september 2009 at 15:34, and is filed under Tutorials, Webudvikling, Wordpress. Follow any responses to this post through RSS 2.0. Du kan efterlade en kommentar eller lave en trackback fra din egen side. |
Sådan kaldes javascripts i Wordpress
about 3 months ago - 1 kommentar
Da version 1 af stylesheets og templates til Horsens kommunes biblioteker i sin tid blev kodet op, havde jeg hentet javascript-biblioteket jQuery + diverse plugins, placeret dem i wp-theme mappen og kaldt dem manuelt i theme’ets header.php script. Det var før jeg fandt ud af, at jQuery + plugins faktisk er inkluderet i Wordpress og Mere >
Linkhøst fra 20. august til 25. august
about 6 months ago - Ingen kommentarer
Bogmærker indsamlet fra 20. august til 25. august
HTML URL Encoding Reference
25. augustURL encoding converts characters into a format that can be safely transmitted over the Internet. Enormt anvendelig, når der skal laves links til en OPAC.
Site5 – Web Hosting for Webmasters
24. augustAnother web hosting company. Unlimited web space, bandwith and domains. @Spiri recommended this one.
Remote Mere >
Linkhøst fra 17. juli til 1. august
about 7 months ago - Ingen kommentarer
Bogmærker indsamlet fra 17. juli til 1. august
Brush Pilot™ – The fast and easy Photoshop brush previewer for Mac OS X
1. augustBrush Pilot™ is a fast and easy application for previewing Adobe® Photoshop® and Adobe Photoshop Elements Brushes (.abr), built exclusively for Mac OS X. Brush Pilot is designed to save you time by allowing Mere >
Linkhøst fra 2. juli til 8. juli
about 8 months ago - Ingen kommentarer
Bogmærker indsamlet fra 2. juli til 8. juli
Advanced Wordpress – Category Based Navigation Instead of Page Based | Intelligent Website Widget Deployment Strategies
8. juliMost Wordpress themes use pages for navigation. This is fine for most single user blogs, but when you want to really start expanding what Wordpress can do, look at using categories for Mere >
Linkhøst fra 16. juni til 17. juni
about 8 months ago - Ingen kommentarer
Bogmærker indsamlet fra 16. juni til 17. juni
Code Styling Project » How to use Wordpress Metaboxes at own plugins
17. juniStarting with WordPress Version 2.7 a new kind of metabox handling has been occured at Backend. You are now able to drag/drop or hide this Boxes. This makes daily work easier.
But there is currently insufficient documentation Mere >
Linkhøst fra 29. maj til 4. juni
about 9 months ago - Ingen kommentarer
Bogmærker indsamlet fra 29. maj til 4. juni
Bogens fremtid er digital | information.dk
4. juniDanske forlag satser stort på salget af e-bøger og lancerer til efteråret over 400 nye titler. Eksplosive salgstal fra USA og England har genoplivet troen på, at bogens fremtid er digital
100 icon sets & 50,000+ icons
31. majIconfinder collected this awesome list of Mere >
Linkhøst fra 27. maj til 28. maj
about 9 months ago - Ingen kommentarer
Bogmærker indsamlet fra 27. maj til 28. maj
New MediaWiki Extension: WPMU Single Sign-on – CUNY Academic Commons Development Blog
28. majWPMu Single Sign-on is a package of extensions for MediaWiki that creates a single, shared login system for MediaWiki and WordPress Multi-User.
RSS Stream – Rick’s HideOut
28. majRSS Stream displays your social feeds in a lifestream way.
WordPress Mere >
Linkhøst fra 22. april til 4. maj
about 10 months ago - Ingen kommentarer
Bogmærker indsamlet fra 22. april til 4. maj
Creating Posts That Appear Only In RSS | Court’s Internet Marketing School – How To Make Money Online
4. majTo create a post that appears in your RSS feed, but doesn’t appear on the homepage or category pages of your site, you can use the Advanced Category Plugin for Mere >
Dagens linkhøst, 16. april
about 10 months ago - Ingen kommentarer
Bogmærker indsamlet den 16. april fra 08:15 til 10:55
Free Vector Art – Download Free Vector Graphics and Vector Art at Vecteezy!
16. aprilVecteezy is an index of Free Vector Graphics available for download by some of the best artists around the world.
Facebook Connect Wordpress Plugin | Sociable! – The Social Media Blog
16. aprilWordpress plugin that allows Mere >
Linkhøst fra 16. marts til 25. marts
about 11 months ago - Ingen kommentarer
Bogmærker indsamlet fra 16. marts til 25. marts
Theme Playground | Consolidate WordPress Plugins to Speed up Your Site
25. martsPlugins give us the ability to add further functionality to our sites. They also can add some nasty speed bumps and (dare I say the word) bloat to our pages that can slow down the load time.
Very Mere >
about 6 months ago
Super godt, Morten! Den fikser du lige som plugin, så jeg kan opdatere WP uden bøvl, ikk’?
about 6 months ago
Jo, man kunne nok lave det som plugin, men jeg havde egentlig tænkt mig at bygge det ind i et theme. Så ville man kunne nøjes med at installere et theme og så ville man have noget, der minder om fuld CMS funktionalitet.
Men jeg har lidt flere tricks i ærmet, inden jeg når så langt.
about 2 months ago
Hej Morten
Mange tak for dette indlæg. Et dejligt trick til at tilføre Wordpress bedre CMS funktionalitet. Jeg brugte koden til oprettelse af én sidebar pr side på et site jeg var ved at udvikle, men oplevede pludselig, at sidebar indholdet rykkede sig umotiveret rundt på siderne. Det gik op for mig, at der er én grum fejl i din kodestump. Der mangler et unikt id for hver sidebar. Id’et skal bare sendes med register_sidebar arrayet. Man kunne f.eks bruge id’et fra hver side for at sikre at de forskellige sidebars altid hang sammen med netop dén pågældende side.
Som dit script er nu, rokerer sidebarerne hvis man sletter eller flytter rundt på sidernes orden… meget ustabilt. Jeg går ud fra, at det samme faktisk gælder for kategori-sidebars-scriptet.
about 2 months ago
Hej Morten
Tak for det. Jeg må indrømme, at jeg aldrig var nået så langt som til at få dét testet af på sider. Grum fejl. Det må kunne fikses, men der skal vist lige graves lidt, for jeg er ikke rigtig en php haj.
Jeg har dog ikke oplevet problemet med kategorier, men har heller ikke testet det i ver. 2.9.
about 1 month ago
Hej Morten
Hmm…problemet burde være præcist det samme med kategorier. Hvis du har nogle sites eller blogs der kører med denne løsning, ville jeg være bekymret. Så tror jeg desværre kun det er et spørgsmål om tid inden dine sidebars giver sig til at flytte rundt på sitet. Problemet opstår selvfølgelig kun, hvis du sletter en eksisterende kategori… så vil de efterfølgende sidebars rykke sig en position tilbage, pga den manglende kategori.
Løsningen er så simpelt som:
# Register one sidebar per category name.
foreach($my_widget_name as $my_widget) {
register_sidebar(array(
‘id’ => ‘category-sidebar-$i’,
‘name’ => ‘Category: ‘ . $my_widget,
‘before_widget’ => ”,
‘after_widget’ => ”,
‘before_title’ => ”,
‘after_title’ => ”, ));
}
about 1 month ago
Arh… beklager. Nu har jeg siddet og fiflet lidt med det, og kan se, at problemet desværre er mere komplekst end som så.
Dine intentioner med koden er god, men Wordpress er bare ikke bygget til at kunne håndtere automatisk oprettelse af sidebars på denne måde.
Det kan selvfølgelig gøres, men kræver nok en sammenkobling med databasen.
Bare lad være med at slette kategorier – så burde der ikke ske noget
about 1 month ago
Tak for forsøget, Morten. Jeg har heldigvis kun haft det kørende i en test-installation indtil videre. Var egentlig godt klar over, at det er at bøje WP til lidt mere, end det er beregnet til, eftersom metoden “knækker” ved for mange sider/kategorier.
Måske må vi så nøjes med en alternativ løsning med metaboxes og custom fields (se f.eks. her). Det ville måske også give mere mening for en indholdsredaktør, der har brug for at lave sekundært indhold på den enkelte side/indlæg her og nu.
Men her savner jeg lidt noget ajax-agtigt til nemt at kunne oprette flere/nye metaboxes.
about 1 month ago
Tja… det er et af de få steder, hvor jeg stadig synes at Wordpress kommer til kort. Det er bare ikke tænkt som en mulighed i Wordpress, med alt for mange eller dynamiske sidebars.
Tak for linket til artiklen. Metaboxe er faktisk en løsning jeg ikke har overvejet… et AJAX interface til oprettelse af metaboxe ville være idéelt, – men jeg kunne måske også godt ønske mig, at metaboxene var tilknyttet forskellige sub-templates, sådan at Write Page siden var forskelligt afhængigt af hvilken template man brugte. Det er jo langt fra sikkert at man har brug for de samme elementer på alle de subtemplates man bruger til sin template.
Men tak for tippet.