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. |
Øg maximum upload filstørrelse på 2 mb i WordPress
about 4 months ago - Ingen kommentarer
Som udgangspunkt kan man kun uploade filer op til 2 mb i WordPress. Ikke nødvendigvis et problem for garvede brugere, der er i besiddelse af et billedbehandlingsprogram, men absolut et problem for brugere, der tror, et billede er et billede, og ikke har begreb om filstørrelser. Fotos fra et 5 megapixel kompaktkamera fylder nemt et
Sådan kaldes javascripts i WordPress
about 8 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
Linkhøst fra 20. august til 25. august
about 11 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.
Linkhøst fra 17. juli til 1. august
about 12 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
Linkhøst fra 2. juli til 8. juli
about 1 year 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
Linkhøst fra 16. juni til 17. juni
about 1 year 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
Linkhøst fra 29. maj til 4. juni
about 1 year 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
Linkhøst fra 27. maj til 28. maj
about 1 year 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
Linkhøst fra 22. april til 4. maj
about 1 year 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
Dagens linkhøst, 16. april
about 1 year 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.
about 11 months ago
Super godt, Morten! Den fikser du lige som plugin, så jeg kan opdatere WP uden bøvl, ikk’?
about 11 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 6 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 6 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 6 months 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 6 months 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 6 months 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 6 months 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.