Categorieën
PHP WordPress

WordPress comment type uitsluiten in comment count

Binnen de Pronamic Post Like plugin gebruiken we het WordPress reactiesysteem om ‘likes’ bij te houden. Hiervoor plaatsen we voor elke ‘like’ een reactie, zodat we per gebruiker kunnen bijhouden wie wat ‘liked’. Elke ‘like’ zorgde er echter ook voor dat het aantal reacties werd verhoogd.

Dit was niet gewenst binnen de website die we aan het ontwikkelen waren. Daarom gingen we opzoek naar een oplossing. Na het doorbladeren van de code van het WordPress reactiesysteem kwamen we al snel de ‘wp_update_comment_count_now’ functie tegen:

https://github.com/WordPress/WordPress/blob/3.6/wp-includes/comment.php#L1620

Binnen deze functie wordt de ‘wp_update_comment_count’ actie aangeroepen. Hier konden we eenvoudig op inhaken om het aantal reacties opnieuw te tellen en een specifieke comment type uit te sluiten:

Categorieën
WordPress

WordPress User Query filter op post type author

Het is standaard niet mogelijk om binnen een WordPress User Query te filteren op auteurs van een specifieke post type. Met behulp van een een filter is deze functionaliteit echter vrij eenvoudig toe te voegen.

Vervolgens kan eenvoudig via een_User_Query argument gefilterd worden op een specifieke post type.

Categorieën
PHP WordPress

WordPress Google Conversion shortcode plugin

In 2012 schreef ik in het bericht “WordPress Google Conversion shortcode” al over hoe je eenvoudig een Google Conversion shortcode kunt integereren in een WordPress bericht of pagina. Inmiddels hebben we de shortcode beschikbaar gesteld in de “Pronamic Google Conversion” plugin.

https://github.com/pronamic/wp-pronamic-google-conversion

Categorieën
JavaScript jQuery WordPress

Gravity Forms dagen tussen datum berekenen

Een aantal weken terug werd ik gevraagd om het aantal dagen tussen twee Gravity Forms datum velden te berekenen. Na een zoektocht via Google kwam ik al snel een JavaScript oplossing tegen op Stack Overflow:

http://stackoverflow.com/a/2627493

Naar aanleiding van dit topic heb ik het volgende script geschreven die inhaakt op de twee Gravity Forms datum velden.

Dit kan erg handig zijn als je het aantal dagen tussen twee datum wilt gebruiken voor het berekenen van bijvoorbeeld een prijs.

Categorieën
iDEAL WordPress

Ogone DirectLink 50001111 fout

Tijdens het onderzoeken van de werking van Ogone DirectLink API kregen we bij elk bericht die we naar Ogone communiceerden het volgende bericht terug:

<?xml version="1.0"?>
<ncresponse

orderID="1375185042"
PAYID="0"
NCERROR="50001111"
STATUS="0">
</ncresponse>

Aan de hand van deze foutmelding konden we helaas niet achterhalen wat er precies fout ging. In het Ogone “Lijst van betalingsstatussen en foutcodes” document konden we lezen dat deze foutcode voor een “Datavalidatiefout” stond, maar dat hielp ook weinig.

Na een zoektocht via Google kwamen we al snel enkele andere Ogone gebruikers tegen die ook dit probleem hadden:

Uiteindelijk hebben we meer opheldering kunnen krijgen over de betreffende foutcode door Ogone meer parameters terug te laten sturen. Via het Ogone dashboard kan dit op de pagina “Configureren » Technische informatie » Feedback” onder “Directlink » Dynamische parameters” geconfigureerd worden. Door de ‘NCERRORPLUS’ parameter toe te voegen wordt het XML antwoord van Ogone veel duidelijker:

<?xml version="1.0"?>
<ncresponse

orderID="1375185989"
PAYID="0"
NCERROR="50001123"
STATUS="0"
NCERRORPLUS="Card type not active for the merchant">
</ncresponse>

Na het wijzigen van ons Visa creditcard testnummer ‘4111111111111111’ naar een MasterCard testnummer ‘5555555555554444’ konden we verder met het testen van de Ogone DirectLink API.

http://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm

Waarschijnlijk gaan we binnenkort de Ogone DirectLink API ook ondersteunen binnen de Pronamic iDEAL plugin zodat deze nog breder is in te zetten.

Categorieën
PHP WordPress

WordPress multitaal (WPML) per taal andere Google Analytics code

Ik kwam recent een website tegen die opgezet was met behulp van de WPML multitaal plugin. Deze website had een maatwerk thema waarin de Google Analytics tracking code per taal in het thema was geprogrammeerd. Een minder flexibele oplossing en daarom wilden we graag overstappen naar de Google Analytics for WordPress plugin. De tracking code moest echter wel per taal anders zijn, dit hebben we behulp van de volgende code gerealiseerd:

Categorieën
WordPress

Unit tests voor WordPress plugins

Een aantal WordPress plugins die we ontwikkelen bij Pronamic worden steeds complexer. Om de verschillende functionaliteiten van deze plugins bij elke release goed te testen kan het interessant zijn om gebruik te maken van unit testing. Met behulp van PHPUnit kunnen eenvoudig tests gedefinieerd worden en vervolgens automatisch uitgevoerd worden. Er zijn een aantal zeer interessante tools beschikbaar waarmee deze tests eenvoudig opgezet kunnen worden.

svn co https://unit-tests.svn.wordpress.org/trunk wordpress-tests
export WP_TESTS_DIR="/Users/remco/wp/wordpress-tests"
Categorieën
PHP WordPress

Zoeken naar enter na afsluitende ?> PHP tag

Als WordPress ontwikkelaar kom ik regelmatig thema’s tegen waarin in functie bestanden zoals functions.php een afsluiten ?> PHP tag wordt gebruikt. Deze afsluitende PHP-tag kan problemen geven als daar nog een spatie of lege regel achter staat. Als je de broncode van een website bekijkt zie je dan vaak bovenaan voor de DOCTYPE declaratie een spatie of een lege regel.

?>

Hierdoor kunnen probleem ontstaan met bijvoorbeeld de XML-RPC-server of XML-sitemaps binnen WordPress. Binnen Eclipse kan gelukkig eenvoudig gezocht worden met behulp van reguliere expressies. Met behulp van de volgende zoekopdracht kan ik dergelijke problemen eenvoudig opspeuren binnen een Eclipse-project:

\?>\s\z

De \s zal overeenkomen met white space en de \z met het einde van het bestand.

We adviseren zelf altijd om PHP niet af te sluiten met een ?> PHP-tag, dit levert vaak meer problemen op dan dat je er profijt van hebt.

Categorieën
WordPress

WordPress optimaliseren door WPEngine

WPEngine is naar mijn idee één van de weinige partijen die echt goed weten wat er komt kijken bij het hosten van WordPress websites. Ze bieden een krachtige hosting oplossing aan die schaalbaar is voor de grotere WordPress websites. Ook bieden ze veel informatie over welke WordPress plugins je beter niet kunt gebruiken en hoe je je WordPress website kunt optimaliseren.

Mark Kelnar (@renderandserve) geeft in een presentatie tijdens WordCamp Atlanta 2012 een aantal WordPress optimalisatie tips. De presentatie is terug te vinden op de volgende pagina en zeker de moeite waard om eens door te lezen:

http://wpengine.com/optimizing-wordpress/

WPEngine heeft een zeer krachtige hosting omgeving voor WordPress neergezet. Volgens raheemm draaien de WPEngine diensten op de volgende configuratie:

  • NGINX (reverse proxy)
  • Apache (webserver)
  • APC (PHP Accelerator)
  • CDN ingebakken in de architectuur
  • Ongelooflijk krachtige hardware

Ik denk dat veel Nederlandse WordPress hossting providers nog veel kunnen leren van de manier waarop WPEngine WordPress hosting aanbiedt.

Categorieën
PHP WooCommerce WordPress

Nederlandse vertaling WooCommerce 2.0.5

In WooCommerce versie 2.0.5 kunnen de vertalingen voor de WordPress beheerdersomgeving ingeladen vanuit een eigen bestand. Op die manier hoeven niet alle WooCommerce vertalingen altijd geladen te worden. In de WooCommerce ‘load_plugin_textdomain’ function is duidelijk te zien hoe dit is opgezet.

Om de vertalingen zo efficiënt mogelijk op te zetten moeten er 2 .PO of .POT bestanden aangemaakt worden. Normaliter scande ik altijd met behulp van Poedit naar alle vertaalbare teksten binnen een plugin. Echter kan ik met Poedit niet onderscheid maken tussen vertalingen binnen de admin omgeving.

Er zijn meerdere gebruikers van Poedit die wel graag van een dergelijke functionaliteit gebruik willen maken. De ontwikkelaar van Poedit geeft echter in een ticket het volgende aan:

 The scanning feature of Poedit is intended for basic, simple uses. If you have more demanding needs, they you should write a proper makefile and call xgettext in it to create a POT file from your sources; then use Poedit just to translate PO catalogs and update them from that POT file.

At this time, I don’t want additional complications in this part of Poedit. Maybe later, when all the other, more serious, problems are fixed.

Ik ben me daarom gaan verdiepen in de werking van xgettext:

Uiteindelijk heb ik de volgende twee commando’s geschreven waarmee we de WooCommerce vertalingen kunnen opdelen in verschillende bestanden.

WooCommerce admin

find ./admin -iname "*.php" -type f | xgettext \
--from-code=UTF-8 \
--keyword=__ \
--keyword=_e \
--keyword=_n:1,2 \
--keyword=_x:1,2c \
--keyword=_ex:1,2c \
--keyword=_nx:1,2,4c \
--default-domain=woocommerce \
--language=PHP \
--copyright-holder="Remco Tolsma" \
--package-name=WooCommerce \
--package-version=2.0.5 \
--msgid-bugs-address="Remco Tolsma <info@remcotolsma.nl>" \
--files-from=- \
--output=woocommerce-admin.pot

WooCommerce

find ./ -iname "*.php" -type f | xgettext \
--from-code=UTF-8 \
--keyword=__ \
--keyword=_e \
--keyword=_n:1,2 \
--keyword=_x:1,2c \
--keyword=_ex:1,2c \
--keyword=_nx:1,2,4c \
--default-domain=woocommerce \
--language=PHP \
--copyright-holder="Remco Tolsma" \
--package-name=WooCommerce \
--package-version=2.0.5 \
--msgid-bugs-address="Remco Tolsma <info@remcotolsma.nl>" \
--files-from=- \
--exclude-file=woocommerce-admin.pot \
--output=woocommerce.pot

Bovenstaande commando’s bestaan uit  2 delen, een ‘find’ commando waarmee alle PHP-bestanden binnen de plugin worden gevonden. En een ‘xgettext’ commando die alle vertalingen binnen deze bestanden op zoekt. Hier worden de WordPress vertaalfuncties als ‘keyword’ meegegeven.

Mocht je overigens bij het uitvoeren van het tweede commando een “Segmentation” fout krijgen dan moet je misschien je gettext pakket updaten. Ik kreeg op mijn Mac deze fout met gettext versie 0.18.1. Na het updaten van gettext via MacPorts naar versie 0.18.2 was dit probleem opgelost:

sudo port selfupdate
sudo port upgrade outdated

Vervolgens hebben we de gegenereerde .POT-bestanden toegevoegd aan onze GlotPress installatie.

Omgeving Aantal teksten
WooCommerce 1391
WooCommerce admin 1112

Waar in WooCommerce 1.6.6 nog 2058 teksten in één bestand stonden en altijd geladen werden is dit met deze wijziging bijna gehalveerd. Deze verbetering hebben we ook verwerkt in de “WooCommerce (nl)” plugin. Met behulp van een Makefile kunnen we eenvoudig de 2 .POT-bestanden aanmaken:

WOOCOMMERCE_DIR=../woocommerce/

# Make POT files
extract:
	cd $(WOOCOMMERCE_DIR) && \
	find ./admin -iname "*.php" -type f | xgettext \
	--from-code=UTF-8 \
	--keyword=__ \
	--keyword=_e \
	--keyword=_n:1,2 \
	--keyword=_x:1,2c \
	--keyword=_ex:1,2c \
	--keyword=_nx:1,2,4c \
	--default-domain=woocommerce \
	--language=PHP \
	--copyright-holder="Remco Tolsma" \
	--package-name=WooCommerce \
	--package-version=2.0.5 \
	--msgid-bugs-address="Remco Tolsma <info@remcotolsma.nl>" \
	--files-from=- \
	--output=$(CURDIR)/languages/woocommerce/woocommerce-admin.pot \

	cd $(WOOCOMMERCE_DIR) && \
	find ./ -iname "*.php" -type f | xgettext \
	--from-code=UTF-8 \
	--keyword=__ \
	--keyword=_e \
	--keyword=_n:1,2 \
	--keyword=_x:1,2c \
	--keyword=_ex:1,2c \
	--keyword=_nx:1,2,4c \
	--default-domain=woocommerce \
	--language=PHP \
	--copyright-holder="Remco Tolsma" \
	--package-name=WooCommerce \
	--package-version=2.0.5 \
	--msgid-bugs-address="Remco Tolsma <info@remcotolsma.nl>" \
	--files-from=- \
	--exclude-file=$(CURDIR)/languages/woocommerce/woocommerce-admin.pot \
	--output=$(CURDIR)/languages/woocommerce/woocommerce.pot