Skip to content

Instantly share code, notes, and snippets.

@OlivierParent
Last active August 29, 2015 14:08
Show Gist options
  • Save OlivierParent/89d0cb52bf23360cec63 to your computer and use it in GitHub Desktop.
Save OlivierParent/89d0cb52bf23360cec63 to your computer and use it in GitHub Desktop.
WordPress.md

CMP – WordPress 4.1

CMP Informatie
Onderwerp WordPress 4.1
Opleidingsonderdeel Crossmedia Publishing
Academiejaar 2014-2015
Docent Olivier Parent
Instelling Arteveldehogeschool
Opleiding Bachelor in de grafische en digitale media
Afstudeerrichting Grafimediabeleid
Keuzeoptie Crossmedia

[TOC]


I. Inleiding

1. Wat is WordPress?

De term WordPress (WP) dekt verschillende ladingen:

WP is sinds de eerste release in 2003 geëvolueerd van bescheiden Blog Tool, over Publishing Platform tot een geavanceerd CMS (Content Management System) waarvan de functionaliteit uitbreidbaar is met behulp van duizenden plugins.

2. Mijlpalen

Bronnen

  • 2000-2002
    De Corsicaan Michel Valdrighi (@kalaphates) maakt met PHP en MySQL de opensource blogsoftware b2/CaféLog.
  • 2003 Twee bloggers/programmeurs, de Texaan Matt Mullenweg (@photomatt) en de Engelsman Mike Little (@mikelittlezed1), geven de eerste versie van hun blogsoftware vrij die gebaseerd is op b2/CaféLog.
  • 2004 Versie 1.0
  • 2005 Versie 2.0 en de lancering van WordPress.com
  • 2010 Versie 3.0
  • 2014 Versie 4.0

3. Versienummering

Semantic Versioning, één van de meer gangbare softwareversienummeringsystemen, gebruikt het formaat X.Y.Z:

  • X: nummer van de Hoofdversie (Major Version) voor grote wijzigingen
  • Y: nummer van de Onderversie (Minor Version) voor kleine wijzigingen zoals functionaliteit toevoegen
  • Z: nummer van de Revisieversie (Patch Version) voor het herstellen van fouten in de software

WP heeft echter gekozen om na onderversie 9 naar een volgende hoofdversie te gaan, ongeacht de grootte van de wijzigingen. Daardoor zijn de wijzigingen tussen versie 2.9 en 3.0 of tussen 3.9 en 4.0 minder groot dan bijvoorbeeld tussen 2.6 en 2.7 of tussen 3.7 en 3.8.

II. Installatie

Voorbeeldproject Het voorbeeldproject vind je op Bitbucket

1. Ontwikkelomgeving

We gebruiken Artevelde Laravel Homestead als ontwikkelomgeving. Volg alle stappen zoals beschreven!

1.1 Configuratie

OPGELET Zorg ervoor dat je een teksteditor geïnstalleerd hebt die YAML-bestanden kan openen, zoals bijvoorbeeld Brackets.

Open Homestead.yaml met onderstaande opdracht.

$ artestead edit

Verwijder het commentaar (#) in de regels onder Crossmedia Publishing (CMP):

# Crossmedia Publishing (CMP)
# ---------------------------

    - map: www.cmp.arteveldehogeschool.local
      to: /home/vagrant/Code/cmp.arteveldehogeschool.local/www/wordpress
      sh: wordpress

OPGELET
In YAML-bestanden heeft de insprong invloed op de betekenis. Verwijder geen spaties!

1.2 Opstarten

Start de Vagrant Box op. De eerste keer moet je dit met de optie --provision doen zodat de domeinnaam gekoppeld wordt aan de en de map gekoppeld worden

$ artestead up --provision

Meld je aan op de Virtual Machine.

$ artestead ssh
vagrant@homestead$ _

2. Mappen

Na het aanmelden op de Vagrant Box gaan we eerst naar de map Code die in de thuismap (~) staat (als je al in deze map bent mag je ~/ weglaten) met de opdracht cd (Change Directory).

vagrant@homestead$ cd ~/Code/

Daarna maken we de map database aan met de opdracht mkdir (Make Directory) en de optie --parents (of korter -p), zodat ook de bovenliggende mappen (Parent Directories) www en cmp.arteveldehogeschool.be zo nodig aangemaakt worden:

vagrant@homestead$ mkdir --parents cmp.arteveldehogeschool.local/www/database/

Vervolgens gaan we naar de www map:

vagrant@homestead$ cd cmp.arteveldehogeschool.local/www/

Tip Gebruik de <tab> toets om (bestaande) mapnamen automatisch aan te vullen en de pijltjestoetsen <up> of <down> om doorheen de CLI-history te gaan!

Het resultaat (Met het opdracht vagrant@homestead$ tree -d Code, maar daarvoor moet je eerst Tree installeren met vagrant@homestead$ sudo apt-get install tree):

~/Code/
└── cmp.arteveldehogeschool.local/
    └── www/
        ├── database/
        └── wordpress/

3. Database

WordPress gebruikt een MySQL database.

3.1 Nieuwe Databasegebruiker

3.1.1 Aanmelden als Databasebeheerder

Meld je aan op de databaseserver als databasebeheerder met onderstaande gegevens.

Databasebeheerder Databasewachtwoord
homestead secret

Daarvoor gebruiken we deze opdracht:

vagrant@homestead$ mysql --user=homestead --password
password: _
mysql> _

Tip Je kan onmiddellijk aanmelden door het wachtwoord op te geven.

vagrant@homestead$ MYSQL_PWD=secret mysql --user=homestead

OPGELET Dit is een veiligheidsrisico want het wachtwoord is zichtbaar in de CLI-history!

3.1.2 Nieuwe databasegebruiker aanmaken

OPGELET De databasegebruiker is de gebruiker waarmee WordPress een verbinding maakt met de database. Dit is geen WordPress-gebruiker!

We maken een databasegebruiker aan met onderstaande gegevens.

Databasegebruiker Databasewachtwoord
cmp_db_user cmp_db_password

Daarvoor gebruiken we deze opdracht:

mysql> GRANT ALL PRIVILEGES ON `cmp_arteveldehogeschool_be`.*
    -> TO 'cmp_db_user' IDENTIFIED BY 'cmp_db_password';

Tip
Je kan ook een hostnaam of IP-adres toevoegen, bijvoorbeeld:

  • 'cmp_db_user'@'%'
  • 'cmp_db_user'@'127.0.0.1'
  • 'cmp_db_user'@'localhost'

De standaardwaarde is % en dat wil zeggen om het even welke host of om het even welk IP-adres. Omdat @'%' de standaard is, mag het weglaten worden.

3.1.3 Afmelden

Meld je af als databasebeheerder met:

mysql> exit
Bye
vagrant@homestead$ _

3.2 Database Aanmaken

3.2.1 Aanmelden als Databasegebruiker

We melden ons aan als de databasegebruiker die we daarnet aangemaakt hebben.

vagrant@homestead$ mysql --user=cmp_db_user --password
password: _
mysql> _
3.2.2 Database Aanmaken

We gaan een database aanmaken met de naam cmp_arteveldehogeschool_be.

mysql> CREATE DATABASE IF NOT EXISTS `cmp_arteveldehogeschool_be`
    -> CHARACTER SET utf8
    -> COLLATE utf8_general_ci;

Bekijk alle databases met:

mysql> SHOW DATABASES;
3.2.3 Afmelden

Meld je af als databasegebruiker met:

mysql> exit
Bye
vagrant@homestead$ _

3.3 Database Backuppen en Terugzetten

3.3.1 Database Backup

Meld je aan op de server en voer onderstaande opdracht uit:

vagrant@homestead$ MYSQL_PWD=cmp_db_password mysqldump --user=cmp_db_user --databases cmp_arteveldehogeschool_be > ~/Code/cmp.arteveldehogeschool.local/www/database/dump.sql

Tip
Je kan databasedumps ook een timestamp geven, als je een historiek wil bijhouden:

vagrant@homestead$ MYSQL_PWD=cmp_db_password mysqldump --user=cmp_db_user --databases cmp_arteveldehogeschool_be > ~/Code/cmp.arteveldehogeschool.local/www/database/dump_$(date +"%Y-%m-%d_%H%M%S").sql
3.3.2 Database Terugzetten
vagrant@homestead$ MYSQL_PWD=cmp_db_password mysql --user=cmp_db_user cmp_arteveldehogeschool_be < ~/Code/cmp.arteveldehogeschool.local/www/database/dump.sql

4. Broncode

We gaan versie 4.1.1 installeren in de map ~/Code/cmp.arteveldehogeschool.local/www/wordpress/

Deze map is in Artevelde Laravel Homestead al automatisch gekoppeld aan de domeinnaam http://www.cmp.arteveldehogeschool.local

Mappenstructuur

~/Code/cmp.arteveldehogeschool.local/
└── www/
    ├── database/
    └── wordpress/
        ├── wp-admin/
        ├── wp-content/
        └── wp-includes/

4.1 Broncode downloaden

Je kan de broncode downloaden van http://nl.wordpress.org/ en het bestand decomprimeren in de map wordpress.

4.2 Alternatieve manieren

Je kan WP ook installeren vanaf de Command-Line Interface.

4.2.1 Installeren met cURL

De eerste en meest eenvoudige manier is met curl

vagrant@homestead$ cd ~/Code/cmp.arteveldehogeschool.local/www/ && curl https://nl.wordpress.org/wordpress-4.1.1-nl_NL.tar.gz | tar zx

Installatie via de Command-Line Interface

4.2.2 Installeren met Git

Een kopie van de WordPress-broncode staat op GitHub. We gaan met behulp van het Source Code Management-programma Git de meest recente versie downloaden.

vagrant@homestead$ WP_VER=4.1.1 WP_DIR=~/Code/cmp.arteveldehogeschool.local/www/wordpress/ && git clone --depth 1 -b "$WP_VER" git://github.com/WordPress/WordPress $WP_DIR && rm -rf $WP_DIR/.git && unset WP_VER WP_DIR

Tip
De allerlaatste onwikkelingsversie kan je downloaden van de master branch. Deze versie is enkel bedoeld om te testen.

vagrant@homestead$ WP_VER=master WP_DIR=~/Code/cmp.arteveldehogeschool.local/www/wordpress/ && git clone --depth 1 -b "${WP_VER}" git://github.com/WordPress/WordPress ${WP_DIR} && rm -rf ${WP_DIR}/.git && unset WP_VER WP_DIR
4.2.3 Installeren met Composer

Een andere manier is door Composer, een package manager voor PHP, te gebruiken. Er is een officieuze WordPress package die door John P. Bloch onderhouden wordt.

vagrant@homestead$ composer create-project johnpbloch/wordpress ~/Code/cmp.arteveldehogeschool.local/www/wordpress/ 4.1.1

4.3 Configuratie

Eens de broncode geïnstalleerd, gaan we naar
http://www.cmp.arteveldehogeschool.local/

Installatie in Browser 00

Kies Nederlands en klik daarna op Continue en daarna op Laten we starten!

Installatie in Browser 01

Veld Waarde
Databasenaam: cmp_arteveldehogeschool_be
Gebruikersnaam: cmp_db_user
Wachtwoord: cmp_db_password
Database-host: localhost
Tabelprefix: wp_

En klik op Verzenden.

Installatie in Browser 02

Daarna klikken we op De installatie starten

Installatie in Browser 03

Veld Waarde
Websitetitel: Crossmedia Publishing
Gebruikersnaam: cmp_gebruiker
Wachtwoord: cmp_wachtwoord
Wachtwoord, tweemaal: cmp_wachtwoord
Je e-mailadres: cmp@arteveldehs.be

En klik op WordPress installeren.

Installatie in Browser 04

Daarna klikken op Inloggen.

Installatie in Browser 05

En inloggen met de WP-gebruikersgegevens.

Veld Waarde
Gebruikersnaam cmp_gebruiker
Wachtwoord cmp_wachtwoord

Installatie in Browser 06

Dan kom je op Sitebeheer, het beheerdersgedeelte van de WP-installatie. Je komt standaard binnen op het Dashboard.

Installatie in Browser 07

Klik op Crossmedia Publishing om naar de startpagina van de site te gaan.

Installatie in Browser 08

4.4 WordPress Netwerk van sites

Zie ook

4.4.1 Wat is een Netwerk?

Je kan meerdere websites maken met één installatie van WordPress, een zogenaamd Netwerk van sites. De huidige website wordt dan de hoofdwebsite en de bijkomende websites staan dan in een subdomein of een submap.

4.4.2 Netwerk activeren

OPGELET: De webserver moet op poort 80 (http) of 443 (https) draaien. Alternatieve poorten (bijv. 8080) zijn niet toegelaten. Hoewel het mogelijk is om de code aan te passen om deze alternatieve poorten toe te laten, is het beter om de serverinstellingen te wijzigen.

Open wp-config.php en voeg volgende code toe:

// …
/* Multisite */
define( 'WP_ALLOW_MULTISITE', true );

/* That's all, stop editing! Happy blogging. */
//…

Sla het bestand op en herlaadt Sitebeheer in de browser.

Onder ExtraNetwerk instellen kan je submappen inschakelen. Je krijgt de nodige aanpassingen te zien.

Netwerk Instellen

III. Gebruik

Zie ook

1. Instellingen

1.1 Algemeen

InstellingenAlgemeen

Instelling Waarde
Website-titel Crossmedia Publishing
Ondertitel Grafimediabeleid
Tijdzone Europa → Brussel
Taal Nederlands

Klik op Wijzigingen opslaan

1.2 Schrijven

InstellingenSchrijven

Instelling Waarde
Standaard berichtcategorie Geen categorie
Standaard berichtformaat Standaard

Klik op Wijzigingen opslaan

1.3 Lezen

InstellingenLezen

Instelling Waarde
Startpagina toont -

Klik op Wijzigingen opslaan

1.4 Reacties

InstellingenReacties

1.5 Media

InstellingenMedia

1.6 Permalinks

De standaard-URL's van WP tonen enkel het nummer van de pagina. Dat is niet gebruiksvriendelijk, noch SEO-vriendelijk.

InstellingenPermalinks

Instelling Waarde
Algemene instellingen Berichtnaam

Klik op Wijzigingen opslaan

2. Gebruikers

2.1 Rollen

Binnen een WP-site heeft een gebruiker een bepaalde Rol (Role):

Niveau Nederlands Engels Rechten
5. Abonnee Subscriber Lezen
4. Schrijver Contributor Berichten bewerken en verwijderen
3. Auteur Author Berichten bewerken, verwijderen en publiceren
2. Redacteur Editor Alle Berichten bewerken, verwijderen en publiceren
1. Beheerder Admin Alles

Voor een multisite WP-installatie is er nog de bijkomende rol van Superbeheerder (Super Admin). Deze rol is nog een niveau hoger dan Beheerder. Een Superbeheerder kan een netwerk van sites beheren en is bovendien ook automatisch Beheerder van elke site in het netwerk. De Superbeheerder kan bepaalde dingen zoals bijvoorbeeld Thema's en Plugins op netwerkniveau beheren.

2.2 Gebruiker Toevoegen

DashboardGebruikers

3. Content types

3.1 Bericht (Post)

3.1.1 Algemeen

Berichten staan in antichronologische volgorde op de Berichtenpagina. Deze pagina is standaard als startpagina ingesteld.

Elk bericht heeft:

  • Titel (Title)
  • Inhoud (Content) die zowel tekst als media kan zijn.

Optioneel kan een Bericht ook nog een Samenvatting (Exerp) hebben.

3.1.2 Notatie (Format)

Een Bericht heeft een bepaalde Notatie:

  • Standaard (Standard)
  • Aside
  • Afbeelding (Image)
  • Video
  • Audio
  • Quote
  • Link
  • Gallerij (Gallery)
3.1.3 Taxonomie (Taxonomy)

Aan een Bericht kan je Categorieën en/of Tags toekennen.

  • Categorieën (Categories) Een Categorie maakt deel uit van een hiërarchische structuur.

  • Tags (Tags) Een Tag maakt geen deel uit van een structuur, maar bestaat op zichzelf.

3.2 Media

Soorten mediabestanden:

  • Afbeeldingen
  • Audio
  • Video
  • Niet gekoppeld

3.3 Pagina (Page)

Een pagina die door de gebruiker handmatig aangepast moet worden, noemt men in WP een statische pagina. Dit in tegenstelling tot de berichtenpagina die automatisch aangepast wordt van zodra er een nieuw bericht gepubliceerd wordt.

Je kan er geen categorieën of tags aan een pagina toekennen, maar je kan wel een pagina een subpagina maken van een andere pagina.

3.4 Reacties (Comments)

4. Pagina's Beheren

4.1 Pagina Toevoegen

Pagina'sNieuwe pagina

4.2 Pagina Bewerken

4.3 Pagina Instellen als Voorpagina

  • InstellingenLezen
    • Je kan wel een pagina instellen als voorpagina die dan in de plaats van de standaard startpagina komt.
    • Een pagina kan ook dienst doen als …, dan worden de berichten getoond in plaats van de inhoud van die pagina.

4.4 Pagina Verplaatsen

4.5 Pagina Verwijderen

IV. Themaontwikkeling

1. Wat is een Thema?

Een Thema (Theme) bepaalt de look and feel en ook een deel van de functionaliteiten van een WordPress-website. Je kan één van de bijna 3.000 thema's downloaden van WordPress.org of je kan zelf een eigen thema maken.

Een goed thema is gemaakt volgens de principes van Responsive Web Design. RWD zorgt ervoor dat een website op verschillende toestellen goed functioneert. Zo kan dezelfde website zich optimaal aanpassen aan de elke schermresolutie (bijv. desktopscherm, smartphonescherm) en inputmanier (bijv. muis, trackpad of aanraakgevoelig scherm).

RWD vergt heel wat codeerwerk in HTML en vooral in CSS en JavaScript. Gelukkig bestaan er responsive frameworks die out of the box al heel wat functionaliteiten voor RWD bevatten en die je als basis voor je website kan gebruiken. Enkele van de populairste dergelijke frameworks zijn Bootstrap (oorspronkelijk gemaakt door Twitter voor hun eigen website) en ZURB Foundation.

Twitter Bootstrap integeren in een thema is op zich ook al heel wat werk, maar je kan je baseren op een basisthema dat Bootstrap al integreert en daarvan een Childthema (Child Theme) maken. Een Childthema is een thema dat enkel de wijzigingen aan het Parentthema bevat, en voor de rest gebruik maakt van het Parentthema. Beide moeten geïnstalleerd zijn.

2. Thema's Beheren

2.1 Toevoegen

We gaan het Thema DevDMBootstrap3 toevoegen.

WeergaveThema's en klik op Nieuwe toevoegen.

Thema Toevoegen 00

Typ "DevDMBootstrap3" in.

Thema Toevoegen 01

Hover over het Thema en klik op Installeren.

Thema Toevoegen 02

Eens het Thema geïnstalleerd is, kan je terugkeren naar Thema's.

Thema Toevoegen 03

Het nieuwe Thema staat nu in de lijst. Het moet niet geactiveerd worden, want we gaan het niet rechtstreeks gebruiken, maar wel via een Childthema.

Thema Toevoegen 04

Je kan wel een Preview bekijken.

Thema Toevoegen 05

3. Thema Ontwikkelen

Zie ook

Nieuwe documentatie

3.1 Inleiding

Alle geïnstalleerde Thema's staan in de map themes

Mappenstructuur

~/Code/cmp.arteveldehogeschool.local/
└── www/
    ├── database/
    └── wordpress/
        └── wp-content/
            └── themes/
                ├── devdmbootstrap3/
                ├── twentyeleven/
                ├── twentyfifteen/
                ├── twentyfourteen/
                ├── twentyten/
                ├── twentythirteen/
                └── twentytwelve/

3.2 Childthema

Zie ook

3.2.1 Waarom een Childthema?

Je kan een Thema volledig van nul zelf opbouwen, maar het is eenvoudiger om van een reeds bestaand thema te vertrekken. Als je van een bestaand thema vertrekt heb je een aantal mogelijkheden:

  1. Het Thema rechtstreeks aanpassen. Bij een automatische update zullen alle wijzigen verloren gaan.
  2. Een kloon maken van het Thema door het te kopiëren naar een nieuwe map. Dan moeten updates manueel doorgevoerd worden.
  3. Een Childthema maken. Zo kan het Parentthema nog altijd automatisch geüpdatet worden en dus ook je Childthema.

Een Childthema maken is dus meestal de beste oplossing.

3.2.2 Childthema Aanmaken

We gaan een Childthema maken op basis van DevDmBootstrap3. Dit Thema is gemaakt door Danny Marchal en is speciaal bedoeld om als basisthema gebruikt te worden. Bootstrap is er reeds in geïntegreerd.

Een Thema moet verplicht een aantal bestanden bevatten:

Bestand Beschrijving
screenshot.png Een schermafbeelding van het Thema.
style.css Bevat de metagegevens van het Thema en stijlen.

Mappen en bestanden

~/Code/cmp.arteveldehogeschool.local/
└── www/
    ├── database/
    └── wordpress/
        └── wp-content/
            └── themes/
                ├── arteveldehogeschool/
                 |  ├── screenshot.png
                 |  └── style.css
                └── devdmbootstrap3/
a. arteveldehogeschool/

We maken een nieuwe map arteveldehogeschool/ in de map wordpress/wp-content/themes/ waarin we de bestanden van ons nieuw Thema gaan zetten.

b. screenshot.png

en zetten er een afbeelding in met de naam screenshot.png. Deze afbeelding moet een verhouding 4:3 hebben en bij voorkeur een afmeting van 880×660 px.

c. style.css

In de map zetten we ook een stylesheet met de naam style.css:

/*
Theme Name:   Arteveldehogeschool
Theme URI:    http://www.arteveldehogeschool.be/
Description:  DevDmBootstrap3 Child Theme
Author:       Olivier Parent
Author URI:   http://www.olivierparent.be/
Template:     devdmbootstrap3
Version:      1.0.0
Tags:         arteveldehogeschool, wordpress
Text Domain:  devdmbootstrap3-child
*/

/* Vanaf hier mag je stijlen toevoegen */

In de commentaar staan de metagegevens van het Thema.

Nadat je style.css opgeslagen hebt, zal het in de Sitebeheer onder Thema's is de lijst verschijnen.

Childthema 00

3.2.3 Childthema Activeren

Een Childthema kan je activeren zoals een gewoon Thema.

Childthema 01

Voor je een Thema activeert kan je een Live voorbeeld bekijken.

Childthema 02

Ga terug naar Thema's door op de knop in de linker bovenhoek te klikken en klik daarna op op de knop Activeren.

Childthema 03

Het actieve Thema staat eerst in de lijst.

Childthema 04

Je kan een aantal instellingen van het Thema aanpassen door op de knop Aanpassen te klikken, of je kan de details bekijken door op de afbeelding te klikken.

Childthema 05

De detailpagina toont de metagegevens die we in styles.css geplaatst hebben.

Het actieve Thema kan je op de website zien.

Childthema 06

V. Pluginontwikkeling

1. Wat is een Plugin?

Een plugin is een stuk(je) software waarmee je de functionaliteiten toevoegt aan WP. Het grote aantal beschikbare plugins die door een levendige community gemaakt wordt, is één van de reden dat WP zo populair is.

2. Plugins Beheren

2. 1 Plugin Updaten

DashboardUpdates, vink de nodige de Plugins aan en klik op Plugins Bijwerken.

Dashboard Updates 00

Als de Plugins bijgewerkt zijn, kan je naar een andere pagina gaan.

Dashboard Updates 01

3. Plugin Ontwikkelen

Zie ook

We gaan een nieuwe plugin maken om lijsten met woordvertalingen te maken van Grafische Termen. Deze plugin gaan we gebruiken om een Custom Post Type voor deze grafische termen toe te voegen aan WP.

3.1 Wat zijn Custom Post Types?

Je hebt een aantal standaard Post Types (Default Post Types):

  • Berichten
  • Media
  • Pagina's
  • Reacties
  • Menu's

Maar je kan ook je eigen Post Types (Custom Post Types) maken.

3.2 Custom Post Type definiëren

Het is mogelijk om een Custom Post Type te definiëren in een Thema, maar aangezien het uitbreidingen zijn op de functionaliteiten van WordPress betreft en niet rechtstreeks met het uitzicht te maken heeft, is het logischer om er een Plugin voor te maken.

We gaan een Custom Post Type maken voor een Grafische term. Een grafische term heeft deze eigenschappen:

  • Naam (de Titel)
  • Beschrijving (de Content)
  • Vertalingen:
    • Frans
    • Engels
    • Duits
3.2.1 Plugin Maken

We maken een nieuwe Plugin met de naam arteveldehogeschool_lexicon. Dit doen we door een nieuwe map met deze naam te maken in de map wordpress/wp-content/plugins/ en een PHP-bestand met dezelfde naam erin te zetten.

Mappen en bestanden

~/Code/cmp.arteveldehogeschool.local/
└── www/
    ├── database/
    └── wordpress/
        └── wp-content/
            └── plugins/
                └── arteveldehogeschool_lexicon/
                    ├── arteveldehogeschool_lexicon.php
                    └── languages/

Het PHP-bestand arteveldehogeschool_lexicon.php moet deze code bevatten:

<?php
/*
Plugin Name: Artveldehogeschool Grafisch Lexicon Vertalingen
Plugin URI: http://www.arteveldehogeschool.be/
Description: Plugin voor Vertalingen van vaktermen in het Grafisch Lexicon.
Version: 1.0.0
Author: Olivier Parent
Author URI: http://www.olivierparent.be/
Text Domain: arteveldehogeschool
License: GPLv2
*/

Bovenstaande code bevat de metagegevens van de Plugin.

3.2.2 Plugin Activeren

Nu de plugin bestaat, moeten we deze activeren in Sitebeheer:

PluginsGeïnstalleerde plugins

Zoek in de lijst plugins naar Artveldehogeschool Grafisch Lexicon Vertalingen en klik op Activeren.

3.2.3 Plugin Vertalen

WP is geschreven in het Engels en daarna vertaald naar verschillende talen waaronder het Nederlands. Wij gaan onze Plugin ook in het Engels schrijven en een Nederlandse vertaling toevoegen.

Een stuk software vertalen duidt men vaak aan met de termen l10n of i18n.

Term Betekenis Verklaring
i18n Internationalization 18 tekens tussen de i en n).
l10n Localization 10 tekens tussenn de l en n).
a. Vertaalbestanden

WP gebruikt het opensource Gettext-systeem voor vertalingen. De vertalingen worden in .po-bestanden geschreven die daarna naar .mo-bestanden gecompileerd worden.

Extensie Type bestand Inhoud
.pot Portable Object Template Vertaalbare tekenstrings (voor alle talen).
.po Portable Object Vertaalde tekenstrings (voor één taal).
.mo Machine Object Gecompileerde versie van het .po-bestand.

Tip: Je kan Poedit gebruiken om .po-bestanden te bewerken en te compileren naar .mo bestanden. BestandNaar MO Compileren…

We maken in de map languages van onze Plugin een nieuw vertaalbestand voor het Custom Post Type met de naam graphic_term. De naam van ons vertaalbestand moet bestaan uit de naam van het Text Domain (hiervoor nemen we dezelfde naam als die van het Custom Post Type: graphic_term) gevolgd door de taalcode die bestaat uit de ISO 639-1-code voor de taal (nl) plus de ISO 3166-1 alpha-2-code voor het land (NL) voor de variant van de taal:

Maak met een teksteditor het bestand graphic_term-nl_NL.po en geeft het deze inhoud:

msgid ""
msgstr ""
"Project-Id-Version: ArteveldehogeschoolLexicon\n"
"POT-Creation-Date: 2014-09-01 12:45+0100\n"
"PO-Revision-Date: 2014-09-01 12:45+0100\n"
"Last-Translator: Olivier Parent\n"
"Language-Team: Arteveldehogeschool\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.7.1\n"
"X-Poedit-Basepath: ..\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
"_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SearchPath-0: .\n"

#: arteveldehogeschool_lexicon.php:30
msgid "Graphic Terms"
msgstr "Grafische termen"

#: arteveldehogeschool_lexicon.php:31
msgid "Graphic Term"
msgstr "Grafische term"

#: arteveldehogeschool_lexicon.php:32
msgid "Add new"
msgstr "Nieuwe grafische term"

#: arteveldehogeschool_lexicon.php:33
msgid "Add new Graphic Term"
msgstr "Nieuwe grafische term toevoegen"

#: arteveldehogeschool_lexicon.php:34
msgid "Edit Graphic Term"
msgstr "Grafische term bewerken"

#: arteveldehogeschool_lexicon.php:35
msgid "View Graphic Term"
msgstr "Grafische term bekijken"

#: arteveldehogeschool_lexicon.php:36
msgid "Search Graphic Terms"
msgstr "Zoek grafische termen"

#: arteveldehogeschool_lexicon.php:37
msgid "No Graphic Terms found"
msgstr "Geen grafische termen gevonden"

#: arteveldehogeschool_lexicon.php:38
msgid "No Graphic Terms found in Trash"
msgstr "Geen grafische termen gevonden in de Prullenbak"

#: arteveldehogeschool_lexicon.php:103
msgid "Translations"
msgstr "Vertalingen"
b. Vertaalbestanden Inladen

Zie ook

Bovenaan in arteveldehogeschool_lexicon.php gaan we de vertalingen inladen met de functie load_plugin_textdomain(). Het eerste argument van de functie is de naam van het Text Domain (graphic_term, dit komt ook voor in de naam van het vertaalbestand) en het laatste argument is de locatie van de map met vertaalbestanden relatief ten opzichte van de map plugins van WP. Deze locatie is arteveldehogeschool_lexicon/languages, maar het is beter om deze naam met functies te bepalen zodat je de plugin kan hernoemen of verplaatsen zonder dat de code aangepast moet worden.

load_plugin_textdomain('graphic_term', false, basename( dirname( __FILE__ ) ) . '/languages' );
c. Vertalingen Toepassen

Zie ook

In de Plugin gebruik je de functie __() om tekst te vertalen. Het eerste argument is tekenstring die vertaald moet worden en de tweede is het Text Domain waaruit de vertaling gehaald moet worden. Indien geen vertaling gevonden wordt, dan wordt de tekenstring die vertaald moet worden teruggegeven.

Bijvoorbeeld:

__('Graphic Terms', 'graphic_term')
3.2.4 Custom Post Type Registreren
a. Functie

We maken nieuwe functie om de Custom Post Type voor een 'grafische term' te registreren. Deze Custom Post Type heeft als naam graphic_term. We noemen de functie register_graphic_term_post_type():

function register_graphic_term_post_type() {

    $text_domain = 'graphic_term';

    // Labels voor op de menuknoppen.
    $labels = array(
        'name'               => __( 'Graphic Terms'                  , $text_domain ),
        'singular_name'      => __( 'Graphic Term'                   , $text_domain ),
        'add_new'            => __( 'Add new'                        , $text_domain ),
        'add_new_item'       => __( 'Add new Graphic Term'           , $text_domain ),
        'edit_item'          => __( 'Edit Graphic Term'              , $text_domain ),
        'view_item'          => __( 'View Graphic Term'              , $text_domain ),
        'search_items'       => __( 'Search Graphic Terms'           , $text_domain ),
        'not_found'          => __( 'No Graphic Terms found'         , $text_domain ),
        'not_found_in_trash' => __( 'No Graphic Terms found in Trash', $text_domain ),
    );

    $args = array(
        'labels' => $labels,
        'menu_position' => 25, // @link http://codex.wordpress.org/Function_Reference/register_post_type
        'menu_icon' => 'dashicons-media-default', // @link https://developer.wordpress.org/resource/dashicons/
        'public' => true,
        'supports' => array( 'title', 'editor'/*, 'custom-fields'*/ ),
    );

    register_post_type( 'graphic_term', $args );

}
b. Hook

Zie ook

Deze functie moeten we nu ook nog laten uitvoeren op het juiste ogenblik. WP voert een aantal Acties bij het opbouwen van een pagina. Aan elk van deze acties kunnen we eigen functies vasthaken aan een Hook.

We gaan onze functie register_graphic_term_post_type() vasthaken aan de Hook init, zodat onze functie uitgevoerd wordt tijdens de Actie init.

add_action( 'init', 'register_graphic_term_post_type' );

Vanaf nu verschijnt er een nieuw menu in Sitebeheer.

3.2.5 Meta Box Tonen
a. Functie om Meta Box te tonen en toevoegen

Zie ook

Als een nieuwe Grafische term aangemaakt wordt, dan moet onder het tekstgebied voor de inhoud nog 3 inputvelden getoond worden in een Meta Box. In de standaard WP-lay-out moeten we hiervoor helaas een tabel gebruiken.

function display_graphic_term_meta_box( $graphic_term ) {

    $text_domain = 'graphic_term';

    $graphic_term_translation = array(
      'fr' => esc_html( get_post_meta( $graphic_term->ID, 'graphic_term_fr', true ) ),
      'en' => esc_html( get_post_meta( $graphic_term->ID, 'graphic_term_en', true ) ),
      'de' => esc_html( get_post_meta( $graphic_term->ID, 'graphic_term_de', true ) ),
    );

    ?>
    <table width="100%">
        <tr>
            <th><?php _e( 'Language', $text_domain ); ?></th>
            <th style="text-align: left"><?php _e( 'Translation', $text_domain ); ?></th>
        </tr>
        <tr>
            <td>français</td>
            <td><input type="text" name="graphic_term_fr" value="<?php echo $graphic_term_translation['fr']; ?>" /></td>
        </tr>
        <tr>
            <td>English</td>
            <td width="100%"><input type="text" name="graphic_term_en" value="<?php echo $graphic_term_translation['en']; ?>" /></td>
        </tr>
        <tr>
            <td>Deutsch</td>
            <td width="100%"><input type="text" name="graphic_term_de" value="<?php echo $graphic_term_translation['de']; ?>" /></td>
        </tr>
    </table>
<?php

}
b. Functie om Meta Box toe te voegen

Zie ook

Nu we een functie display_graphic_term_meta_box() hebben om de Meta Box te tonen op de beheerpagina van het Custom Post Type graphic_term , kunnen we deze aanroepen in een nieuwe functie add_graphic_term_meta_box() waarmee we de Meta Box toevoegen aan de pagina.

We geven de Meta Box de titel 'Translations' die naar het Nederlands vertaald wordt als 'Vertalingen'.

function add_graphic_term_meta_box() {

    $text_domain = 'graphic_term';

    $id       = 'graphic_term_meta_box';          // Id van de meta box.
    $title    = __('Translations', $text_domain); // Titel van de meta box.
    $callback = 'display_graphic_term_meta_box';  // Roept de functie display_graphic_concept_meta_box() aan.
    $screen   = 'graphic_term'; // Toon de meta box op het scherm voor het Custom Post Type 'graphic_term'.
    $context  = 'normal'; // Context waarin de meta box getoond moet worden. Keuze uit 'normal', 'side' of 'advanced'.

    add_meta_box( $id, $title, $callback, $screen, $context );

}
c. Hook

Zie ook

We gaan onze functie add_graphic_term_meta_box() vasthaken aan de Hook admin_init, zodat onze functie uitgevoerd wordt tijdens de Actie admin_init.

add_action( 'admin_init', 'add_graphic_term_meta_box' );
3.2.6 Meta Box-gegevens opslaan
a. Functie

Zie ook

De gegevens in de Meta Box worden niet automatisch opgeslagen. Daarom moeten we hier zelf een functie voor maken. We moeten van elke vertaling controleren of er een POST-variabele ($_POST) bestaat (isset) en zo ja, moeten we nagaan of deze niet (!) leeg (empty()) is.

Voordat de gegevens opgeslagen kan worden moeten we vermijden dat schadelijke code de database of de website kan beschadigen door de functie sanitize_text_field() op de gegevens toe te passen. Tenslotte kunnen we de gegevens opslaan met de functie update_post_meta().

function save_graphic_term_post_meta_data( $graphic_term_id, $graphic_term ) {

    if ( 'graphic_term' == $graphic_term->post_type ) {

        // Frans
        if ( isset( $_POST['graphic_term_fr'] ) && !empty( $_POST['graphic_term_fr'] ) ) {

            $graphic_term_fr = sanitize_text_field( $_POST['graphic_term_fr'] );

            update_post_meta( $graphic_term_id, 'graphic_term_fr',  $graphic_term_fr);
        }

        // Engels
        if ( isset( $_POST['graphic_term_en'] ) && !empty( $_POST['graphic_term_en'] ) ) {

            $graphic_term_en = sanitize_text_field( $_POST['graphic_term_en'] );

            update_post_meta( $graphic_term_id, 'graphic_term_en', $graphic_term_en );
        }

        // Duits
        if ( isset( $_POST['graphic_term_de'] ) && !empty( $_POST['graphic_term_de'] ) ) {

            $graphic_term_de = sanitize_text_field( $_POST['graphic_term_de'] );

            update_post_meta( $graphic_term_id, 'graphic_term_de', $graphic_term_de );
        }

    }

}
b. Hook

Zie ook

De functie save_graphic_term_post_meta_data() moet uitgevoerd worden nadat de Custom Post Type opgeslagen wordt. Daarom haken we ze vast aan de Hook save_post.

De functie heeft 2 parameters ($graphic_term_id en $graphic_term) die elk als argument meegegeven moeten worden, daarom moeten we als vierde argument het cijfer 2 meegeven aan de functie. Hierdoor moeten we ook argument drie meegeven dat de prioriteit (volgorde van uitvoeren) bepaalt. Deze willen we niet wijzigen, daarom geven we null mee (wat eigenlijk 'geen waarde' betekent) zodat de functie de voorafgedefinieerde standaardwaarde (10) gebruikt.

add_action( 'save_post', 'save_graphic_term_post_meta_data', null , 2);
3.2.7 Pagina maken om de Custom Post Types te uploaden
a. Functie voor uploadpagina

Deze functie maakt een uploadpagina met formulier en verwerkt het formulier waneer het verstuurd is. Er wordt enkel een nieuwe grafische term toegevoegd als die nog niet in de database bestaat. De controle gebeurt met de functie post_graphic_term_exists() (zie D).

Zie ook

function upload_graphic_terms_page() {

    $text_domain = 'graphic_term';

    ?>
    <h2><?php echo __('Upload Graphic Terms', $text_domain); ?></h2>
    <form action="" method="post" accept-charset="UTF-8" enctype="multipart/form-data">
        <input type="file" name="csv-graphic-terms">
        <button type="submit" class="button"><?php echo __('Upload', $text_domain); ?></button>
    </form>
<?php
    if (isset($_FILES['csv-graphic-terms']) && !$_FILES['csv-graphic-terms']['error']) {
        $graphic_terms = array();

        // Bestand inlezen, regel per regel
        $file_name = $_FILES['csv-graphic-terms']['tmp_name'];

        ini_set('auto_detect_line_endings', '1'); // In het geval deze optie in php.ini niet aan zou staan.

        $file = fopen($file_name, 'r');

        if ($file) {
            $i = 0;
            while ($line = fgetcsv($file, null, ';')) {
                if ($i++ > 0) {
                    if ($i % 2 === 0) {
                        $graphic_terms[] = array(
                            'title'   => $line[0],
                            'content' => null,
                            'fr'      => $line[1],
                            'en'      => $line[2],
                            'de'      => $line[3],
                        );
                    } else {
                        $previous_item = count($graphic_terms) - 1;
                        $graphic_terms[$previous_item]['content'] = $line[0];
                    }
                }
            }
            fclose($file);
        }

        $user_ID = get_current_user_id();

        $added_count = 0;

        // Ingelezen gegevens verwerken
        foreach ($graphic_terms as $graphic_term) {

            $post = array(
                'post_title'   => $graphic_term['title'],
                'post_content' => $graphic_term['content'],
                'post_status'  => 'publish',
                'post_type'    => 'graphic_term',
                'post_author'  => $user_ID,
            );

            // Voer de ingesloten code enkel uit als de grafische term nog NIET bestaat.
            if ( !post_graphic_term_exists( $post['post_title'] ) ) {
                // Grafische term toevoegen aan de databasetabel 'wp_post'.
                $graphic_term_id = wp_insert_post($post);

                // Metagegevens (vertalingen) toevoegen voor de nieuwe grafische term aan de databasetabel 'wp_postmeta'.
                if ($graphic_term_id) {
                    $added_count++;
                    foreach (array('en', 'fr', 'de') as $lang) {
                        $key = 'graphic_term_' . $lang;
                        update_post_meta( $graphic_term_id, $key, $graphic_term[$lang] );
                    }
                }
            }

        }

        echo "<p>{$added_count} grafische termen toegevoegd!</p>";
    }

}
b. Functie om een menu-item toe te voegen

Zie ook

Deze functie voegt een menu-item voor de uploadpagina toe aan het menu. De functie doet dit twee maal: een keer als submenu en een keer als menu. Dit is enkel om het verschil te demonstreren, normaal kies je maar een van de twee.

function add_upload_graphic_terms_submenu_page() {

    $text_domain = 'graphic_term';

    $parent_slug = 'edit.php?post_type=graphic_term';
    $page_title  = __('Upload Graphic Terms', $text_domain ); // Titel van de pagina (<title>-element)
    $menu_title  = __('Upload Graphic Terms', $text_domain );
    $capability  = 'publish_posts'; // @link http://codex.wordpress.org/Roles_and_Capabilities
    $menu_slug   = 'upload-graphic-terms';
    $callback    = 'upload_graphic_terms_page';
    $icon_url    = 'dashicons-media-spreadsheet'; // @link https://developer.wordpress.org/resource/dashicons/
    $position    = 27; // @link https://developer.wordpress.org/reference/functions/add_menu_page/

    add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $callback );
    add_menu_page (                 $page_title, $menu_title, $capability, $menu_slug, $callback, $icon_url, $position );
}
c. Hook

Zie ook

We gaan onze functie add_upload_graphic_terms_submenu_page() vasthaken aan de Hook admin_init, zodat onze functie uitgevoerd wordt tijdens de Actie admin_init.

add_action( 'admin_menu', 'add_upload_graphic_terms_submenu_page' );
d. Functie om te controleren of een grafische term al bestaat in de

Zie ook

De onderstaande functie is gebaseerd op de standaard WP-functie post_exists(), maar dan aangepast zodat enkel posts van het type Custom Post Type graphic_term gecontroleerd worden. Deze functie gebruikt een normale MySQL-query.

function post_graphic_term_exists($title, $content = '', $date = '') {
    global $wpdb;

    $post_title   = wp_unslash( sanitize_post_field( 'post_title'  , $title  , 0, 'db' ) );
    $post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) );
    $post_date    = wp_unslash( sanitize_post_field( 'post_date'   , $date   , 0, 'db' ) );

    $query = "SELECT ID FROM $wpdb->posts WHERE 1=1";
    $args = array();

    $query .= ' AND post_type = %s';
    $args[] = 'graphic_term';

    if ( !empty ( $date ) ) {
        $query .= ' AND post_date = %s';
        $args[] = $post_date;
    }

    if ( !empty ( $title ) ) {
        $query .= ' AND post_title = %s';
        $args[] = $post_title;
    }

    if ( !empty ( $content ) ) {
        $query .= 'AND post_content = %s';
        $args[] = $post_content;
    }

    if ( !empty ( $args ) )
        return (int) $wpdb->get_var( $wpdb->prepare($query, $args) );

    return 0;
}

VI. WordPress-site Hosten

Zie ook

1. Hosting

1.1 Vereisten

De meeste PHP/MySQL-webhosting pakketen ondersteunen WordPress, maar controleer eerst of hosting aan de aanbevolen vereisten voldoet:

  • PHP 5.4+ (minimum 5.2.4)
  • MySQL 5.5+ (minimum 5.0)
  • Apache HTTP Server met mod_rewrite

1.2 Gratis Hosting

Op Byethost Free Webhosting kan je gratis je website hosten.

1.2.1 Registratie en Gegevens

Na registratie krijg je een e-mail met een link om je account te activeren. Daarna krijg je een e-mail met daarin deze gegevens:

  • Byethost cPanel
    • Username: b18_00000000
    • Password: mijn_wachtwoord
  • Your URL: ``
  • Byethost FTP
  • Server: ftp.byethost18.com
  • Login: b18_00000000
  • Password: mijn_wachtwoord
  • Byethost MySQL
    • Database Name: database moet in cPanel aangemaakt worden.
    • Username: b18_00000000
    • Password: mijn_wachtwoord
    • Server: zie cPanel
1.2.1 Subdomein

Je kan eventueel een subdomein aanmaken voor je website via cPanel. Je kan kiezen uit een aantal domeinnamen, maar het gevraagde subdomein moet uiteraard nog beschikbaar zijn op het domein.

Voor elk subdomein wordt een nieuwe map gemaakt op de server, met als naam de volledige domeinnaam. De submap htdocs is de map waarin je alle (publieke) bestanden moet plaatsen. Dus alles wat in je lokale omgeving in de map ~/Code/cmp.arteveldehogeschool.local/www/wordpress/ staat.

Ga nog niet onmiddellijk uploaden via FTP, want eerst moeten er nog een aantal aanpassingen gebeuren aan de database en de WP-configuratie zodat WordPress overweg kan met de (nieuwe) domeinnaam.

1.2.2 Database
a. Database aanmaken

Het eerste wat je moet doen is een database aanmaken via cPanel

De database geef je dezelfde naam als je lokaal project (cmp_arteveldehogeschool_be). Byethost zal de naam automatisch met je gebruikersnaam prefixen. Het databasewachtwoord zal hetzelfde wachtwoord zijn als dat van je Byethost account.

Uiteindelijk zullen de gegevens er bijvoorbeeld zo uitzien:

  • Byethost MySQL
    • Database Name: b00_00000000_cmp_arteveldehogeschool_be
    • Username: b00_00000000
    • Password: mijn_wachtwoord
b. Database migreren

Makkelijke manier
De eenvoudigste manier is gewoon een nieuwe installatie uitvoeren. Daarna kan je de gegevens in ExtraExporteren exporteren naar een XML-bestand (bijv. crossmedia-publishing.wordpress.2015-12-31.xml).

Daarna kan je de gegevens terug importeren in een andere WordPress-installatie. In deze installatie zal je eerst de WordPress Importer moeten installeren via ExtraImporteren: WordPress en de plugin activeren.

Daarna opnieuw ExtraImporteren: WordPress en het XML-bestand selecteren.

Moeilijke manier
Een moeilijkere en omslachtigere manier bestaat eruit de databasetabellen te importeren met PhpMyAdmin en dan onderstaande tabellen te doorzoeken naar de oude domeinnaam (www.cmp.arteveldhogeschool.local) en die een voor een te vervangen door de nieuwe (bijv. cmp.byethost00.com).

  • wp_site
  • wp_sitemeta
  • wp_blogs
  • wp_options
  • wp_usermeta
1.2.4 Uploaden via FTP

Gebruik bij voorkeur Filezilla Client, omdat je met dit gratis FTP-programma zowel de lokale map op je eigen computer als de remote map op de FTP-server kan zien, inclusief alle verborgen bestanden.

  • Lokale site: ~/Code/cmp.arteveldehogeschool.local/www/wordpress/
  • Externe site: /cmp.byethost00.com/htdocs
1.2.5 Configuratie aanpassen

Je kan een aangepaste versie van wp-config.php uploaden, maar het is iets eenvoudiger om via de Byethost cPanel Online File Manager de aanpassing rechtstreeks op de server te doen.

  • b00_00000000_cmp_arteveldehogeschool_be
  • Username: b00_00000000
  • Password: mijn_wachtwoord
  • Server: zie cPanel
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment