Som nævnt i forrige indlæg, vil jeg her på bloggen skrive om flere af de nye funktioner og detaljer, som WordPress 3.0 har medbragt. Denne gang gælder det Custom Post Types – den mest ventede nyhed efter min mening. Jeg vil komme ind på, hvad det er (og ikke er), hvilke muligheder det giver, og hvordan man bruger det. Selvom det bliver lidt teknisk, så vil selv den mindre erfarne WordPress-udvikler kunne oprette og eksperimentere med brugerdefinerede typer ved at følge denne guide.

Jeg vil nogle gange referere til Custom Post Types som indholdstyper (eller bare typer) i dette indlæg. Nogen ville mene, at det i så fald er bedre at skrive indlægstyper eller post-typer, men førstnævnte vil være misvisende, mens det andet lyder ret dumt og kan misforstås af den almindelige bruger. Det er korrekt, at indlæg er en Custom Post Type, dvs. en indholdstype, men en Custom Post Type er ikke kun indlæg. Og de typer, man selv opretter, vil heller ikke opføre sig som almindelige indlæg (det kan lade sig gøre, men hvorfor så oprette den nye type?).

Grunden til, at det så ikke hedder f.eks. Custom Content Types er, at alle typer lagres i wp_posts i databasen. Derfor kunne det kaldes post-typer, men jeg har valgt at kalde dem indholdstyper, fordi jeg mener, at denne term passer bedst, og fordi jeg for læsevenlighedens skyld ikke gider bruge Custom Post Types hele tiden.

Så fik vi det på plads.

Resume

Når der skulle oprettes nye typer af indhold førhen, var man nødt til at bruge forskellige plugins eller de såkaldte “egne felter” og meta-bokse i sider og indlæg. Dette kunne resultere i et rodet helvede i frontend. Sådan skal det ikke være mere. Kernen af WordPress 3.0 indeholder selv fem Custom Post Types: indlæg, side, vedhæftning, revision og menu (post, page, attachment, revision, nav_menu). I stedet for kun at være i stand til at oprette nye sider og indlæg, så er det nu muligt at oprette sin helt egen type – nemt og bekvemt. Det kunne f.eks. være:

  • Kalender/Begivenheder
  • Galleri
  • Podcasts
  • Testimonials/Citater
  • Register

Resultatet:

Custom Post Types i WordPress 3.0

Registrering af Custom Post Types

Første skridt er at registrere den nye indholdstype. Dette kan gøres i temafunktioner (functions.php) eller i et WordPress-plugin. Fordelen ved sidstnævnte er, at typerne ikke vil forsvinde, hvis man skifter tema. Indsæt følgende kode:

add_action("init","custom_post_type");

function custom_post_type() {
    register_post_type('quote',array(
        'labels' => array(
            'name' => 'Citater',
            'singular_name' => 'Citat',
            'add_new_item' => 'Opret nyt citat',
            'add_new' => 'Tilføj nyt',
            'edit_item' => 'Rediger citat',
            'new_item' => 'Nyt citat',
            'view_item' => 'Vis citat',
            'search_items' => 'Find citater',
            'not_found' =>  'Ingen citater fundet',
            'not_found_in_trash' => 'Ingen citater fundet i papirkurven'
        ),
        'public' => true,
        'supports' => array(
             'title',
             'editor',
             'excerpt',
             'revisions'
         )
    ));
}

En ny fane med titlen Citater vil nu vise sig under Kommentarer, ligesom på det første billede. Denne type hedder quote og understøtter titel, editor, uddrag og revisioner.

Konfigurer indholdstypen, så den passer til din WordPress-side

Hvis du har andre mål for din type, så kan du læse om alle variabler til register_post_type-funktionen. De er listet og forklaret her:

labels

Giver mulighed for at ændre visse standardbegreber efter eget behov. Udover de begreber, der allerede står i kodeeksemplet foroven, kan man tilføje:

  • ‘parent_item_colon’ – Teksten, der vises ved indhold med forælder i administrationen. Kræver selvfølgelig, at indholdstypen er hierarkisk. Standard er “Forælderside:”.

capability_type

Angiver den type af rettigheder, som en bruger skal have for at administrere indholdstypen. Standard er post – altså samme rettigheder som ved indlæg.

capabilities

Finere kontrol af rettigheder. Som standard, dvs. hvis capability_type = post, vil rettighederne se ud som dette:

  • ‘edit_post’
  • ‘edit_posts’
  • ‘edit_others_posts’
  • ‘publish_posts’
  • ‘read_post’
  • ‘read_private_posts’
  • ‘delete_post’

Ændrer man capability_type = quote, vil de automatisk se således ud:

  • ‘edit_quote’
  • ‘edit_quotes’

Med denne variabel kan man manuelt ændre rettighederne til det, man ønsker.

'capabilities' => array(
	'edit_post' => 'edit_quote',
	'edit_posts' => 'edit_quotes',
	'edit_others_posts' => 'edit_others_quotes',
	'publish_posts' => 'publish_quotes',
	'read_post' => 'read_quote',
	'read_private_posts' => 'read_private_quotes',
	'delete_post' => 'delete_quote'
),

public

Er den sat til true vil:

  • show_ui = true – Vil vise en brugergrænseflade af indholdstypen i administrationen.
  • publicly_queryable = true – Vil gøre det muligt at foretage forespørgsler til indholdstypen.
  • exclude_from_search = false – Vil ekskludere indholdtypen fra søgninger.
  • show_in_nav_menus = true – Indholdstypen vil kunne bruges i menuen.

Og vice versa. Standard er false. Ønsker man i stedet en finere kontrol over et eller flere af disse fire variabler, angiver man blot disse.

'public' => true,
'exclude_from_search' => true,
'show_in_nav_menus' => false

Dette ekskluderer typen fra søgninger, ligesom man heller ikke kan bruge den i menuen.

hierarchical

Indholdstypen vil opføre sig hierarkisk, ligesom Sider. Standard er false.

query_var

Skal der foretages en forespørgsel til indholdstypen, vil variablen være navnet på typen (quote), hvis denne er true. Dette kan ændres her. Standard er true.

rewrite

Den permanente link-base er navnet på indholdstypen, hvis denne er true. Det vil sige: intox.dk/quote/titel. Ønsker man, at ens egen struktur også tages i brug, f.eks. /%year%/%monthnum%/%postname%/ skrives dette:

'rewrite' => array(
    'slug' => 'quote',
    'with_front' => true
)

Dette gør, at man kan tilgå en side både med intox.dk/2010/07/quote/titel og intox.dk/quote/titel. Standard er true (hvilket betyder with_front = false).

taxonomies

Hvis man har en eksisterende taksonomi, som man gerne vil tilføje til sin indholdstype, så gøres det her. For at tilføje tags og kategorier:

'taxonomies' => array(
    'post_tag',
    'category'
)

Hvordan man opretter sine egne taksonomier vil jeg komme ind på i et andet indlæg.

can_export

Gør det muligt at kunne eksportere indlæg af denne indholdstype med eksportværktøjet. Standard er true.

menu_position

Ændr rækkefølgen på fanen i administrationen.

  • 5 – under Indlæg
  • 10 – under Medier
  • 20 – under Sider

Standard er under Kommentarer.

menu_icon

Som standard er menuikonet for indholdstypen magen til ikonet for indlæg. Har man et andet ikon i sin tema-mappe (eller plugin-mappe), som man hellere vil bruge, skrives dette:


'menu_icon' => get_stylesheet_directory_uri().'/images/icon-quote.png'

Det anbefales, at ikonet har størrelsen 16×16 pixels.

supports

Hvilke moduler, der skal vises i redigeringsvinduet, angives her.

  • ‘title’ – titel.
  • ‘editor’ – WYSIWYG-editor.
  • ‘author’ – valg af forfatter.
  • ‘thumbnail’ – såfremt teamet understøtter thumbnails, kan denne indholdstype også.
  • ‘excerpt’ – uddrag.
  • ‘trackbacks’
  • ‘custom-fields’ – egne felter.
  • ‘comments’ – kommentarer.
  • ‘revisions’ – gemmer revisioner.
  • ‘page-attributes’ – sideegenskaber. indholdstypen skal være hierarkisk.

Vis indholdet af dine egne typer i frontend

Hvis dit tema indeholder single.php vil denne blive brugt som skabelon for din indholdstype. Ønsker man en anden skabelon, kan dette hurtigt opnås ved at oprette typenavn-single.php i sin tema-mappe. I dette tilfælde quote-single.php.

For at vise flere citater på samme side, dvs. en arkivside, kan følgende bruges i en skabelon:


<?php global $wp_query;

$wp_query = new WP_Query(array('post_type' => 'quote'));
if(have_posts()) while (have_posts()) : the_post(); ?>

<!-- Indhold her -->

<?php endwhile; ?>

De tags, der normalt kan bruges i The Loop, kan selvfølgelig også bruges i disse eksempler.

Konklusion

Stadig med så langt? Med Custom Post Types er WordPress rykket et stort skridt fremad, hvad angår dets fleksibilitet som CMS. Der er, efter min mening, stadig mangler – f.eks. automatisk oprettelse af en arkivside (med feeds) og større kontrol over de permanente links og grænsefladen i administrationen. Jeg er klar over, at dette på nuværende tidspunkt er muligt, men det er en smule omstændigt, og det er ikke en del af Custom Post Types. Det er sikkert heller ikke alle indholdstyper, der vil få brug for dette – måske tværtimod – for de kan bruges på mange måder, og man fristes til at skrive, at det kun er fantasien, der sætter grænser.

Hvordan vil du selv bruge din første type efter at have læst denne guide?

Del:

2 kommentarer

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

    • Tilføjer du ‘post_tag’ som taksonomi til din indholdstype, vil alle tags, du benytter, kunne findes i skyen. Når du klikker på et tag, som du kun har benyttet til din egen type, bliver du mødt af en fejl 404, fordi det kun er typen ‘post’ som standard inkluderes i arkiverne. Modificer tag.php (eller archive.php) for at inkludere indlæg af din egen type ved at indsætte følgende kode før The Loop:

      global $wp_query;
      query_posts(
            array_merge(
                  array('post_type'=>array('post','dintype')),
                 $wp_query->query
            )
      );

      Det samme gør du i category.php, hvis du tilføjer ‘category’ som taksonomi. Jeg er ikke helt klar over, om man kan inkludere ens typer i div. arkiv-widgets, men måske der findes nogle hooks til det? Som jeg nævnte i artiklen er de indholdstyper, som man selv opretter, ikke beregnet til at opføre sig som almindelige indlæg.
      For at inddele indlæg i sektioner er det bedre at bruge kategorier og f.eks. også brugerdefinerede taksonomier.

      Jeg håber dette besvarede dit spørgsmål.