Categorie archief: WordPress

WordPress menu custom current URL class

Veel WordPress ontwikkelaars zullen wel eens tegen beperkingen van de standaard WordPress menu classes aangelopen zijn. Zo is het soms lastig om actieve menu items te benaderen bij diepere menu’s met verschillende type menu items. Zo ook bij een menu met als hoofditem een pagina en daaronder een custom post type archief link:

  • Pagina
    • Custom post type ‘Project’ archief
      • Single ‘Project’

Om er voor te zorgen dat op een single ‘Project’ de pagina ook een class krijgt gebruiken we de volgende WordPress filter functie:

WordPress in readonly (alleen lezen) modus

Bij het verhuizen van een WordPress website naar een nieuwe hosting omgeving kan het handig zijn om de WordPress website tijdelijk in readonly (alleen lezen) modus te zetten. Op die manier kun je voorkomen dat er nieuwe berichten, reacties, formulierinzendingen, etc. geplaatst worden na je database dump/export. Met behulp van de volgende .htaccess regels kun je een website vaak in readonly (alleen lezen) modus zetten:

<LimitExcept GET HEAD>
  Order Allow,Deny
  Deny from all
</LimitExcept>

Bron: http://serverfault.com/a/270971

Update 22 juli 2014

Mocht bovenstaande code niet functioneren dan hetzelfde ook gerealiseerd worden met behulp van de volgende code:

RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|POST|PUT)
RewriteRule .* - [F]

Bron: http://www.xpertdeveloper.com/2012/02/limit-request-methods-using-htaccess/

Bug Yoast – Google Analytics for WordPress – the_content leeg

In de “Google Analytics for WordPress” plugin van Yoast schijnt een bug te zitten in de ‘trackoutbound’ en ‘trackcrossdomain’ functionaliteit. Yoast zorgt er binnen deze functionaliteit voor dat links worden aangepast:

Zodra we in een Gravity Forms formulier een link in een ‘Sectie-einde’ plaatsen is plotseling de output van de inhoud van de WordPress pagina/bericht leeg.

Gravity Forms - Sectie-einde met link

Na wat debug werk met een ‘the_content’ filter en de prioriteit van 0 te verhogen naar 100 kwamen we er al snel achter dat het mis ging bij de ‘the_content’ filter van Yoast zijn Google Analytics plugin.

Binnen de filter van Yoast worden links met behulp van een reguliere epxressie aangepast. Ik ben zelf  geen fan van reguliere expressies. Er zijn naar mijn idee namelijk erg weinig ontwikkelaars die goed weten hoe reguliere expressies werken. Daardoor zijn ze lastig in beheer en is een fout snel gemaakt. Ik probeer ze daarom zelf altijd te vermijden.

In dit geval zal er waarschijnlijk ook een fout in de plugin van Yoast zitten, waardoor de complete content van een bericht/pagina leeg wordt gemaakt. Hopelijk kan dit probleem opgelost worden in een toekomstige release. Een controle op de lengte van de content na het wijzigen van de links zou misschien ook slim kunnen zijn. De content zou immers niet korter moet worden, als dat wel het geval is is er waarschijnlijk wat fout gegaan.

WordPress plugins en Grunt

Met behulp van Grunt is het mogelijk om bepaalde taken bij het ontwikkelen van bijvoorbeeld software te automatiseren. Ook bij het ontwikkelen van WordPress plugins kan Grunt handig zijn, zo heb ik vandaag de WordPress plugin “Pronamic iDEAL” uitgebreid met een Gruntfile. Momenteel zorgt Grunt er voor dat de JavaScript bestanden automatisch gecontroleerd worden op kwaliteit met JSLint. Ook worden alle PHP bestanden automatisch gecontroleerd met PHPLint. Aanvullend wordt ook automatisch de PHPUnit tests uitgevoerd.

De Gruntfile voor de “Pronamic iDEAL” plugin is te vinden op de GitHib repository:
https://github.com/pronamic/wp-pronamic-ideal/blob/develop/Gruntfile.js

Handige resources hierbij waren:

WooCommerce 2.1 ‘Toevoegen aan winkelwagen’ tekst wijzigen

In het bericht “WooCommerce ‘Toevoegen aan winkelwagen’ tekst wijzigen” beschrijf ik hoe binnen WooCommerce de ‘Toevoegen aan winkelwagen’ tekst gewijzigd kan worden. Helaas heeft WooThemes in versie 2.1 van de WooCommerce plugin wijzigingen doorgevoerd waardoor deze oplossing niet meer werkt.

Vanaf WooCommerce 2.1 is namelijk de ‘add_to_cart_text’ filter verwijderd:
https://github.com/woothemes/woocommerce/blob/v2.0.20/templates/loop/add-to-cart.php#L46

In plaats daarvan is er in WooCommerce 2.1 de ‘woocommerce_product_single_add_to_cart_text’ filter:
https://github.com/woothemes/woocommerce/blob/v2.1.0/includes/abstracts/abstract-wc-product.php#L449

function prefix_add_to_cart_text( $text ) {
	$text = __( 'Add', 'text_domain' );

	return $text;
}

add_filter( 'woocommerce_product_single_add_to_cart_text', 'prefix_add_to_cart_text' );

Bovenstaande code kan toegevoegd worden aan het WordPress functies thema bestand (functions.php). Vaak kan de code zonder problemen aan het eind van dit bestand toegevoegd worden. Als je niet werkt met een maatwerk thema dan kan het overigens handig zijn om deze toevoeging binnen een child thema of plugin te definiëren. Op die manier kun je zonder problemen je thema blijven bijwerken.

Tekst Filter GitHub
Add to cart woocommerce_product_single_add_to_cart_text GitHub
Read more woocommerce_product_add_to_cart_text GitHub

WooCommerce bestellingen met iDEAL Basic automatisch geannuleerd

Een aantal WordPress gebruikers die met WooCommerce een webwinkel hebben opgezet en een iDEAL Basic aansluiting hebben zullen opgemerkt hebben dat betaalde bestellingen soms automatisch geannuleerd worden. Dit wordt veroorzaakt een automatisch systeem van WooCommerce die bestellingen met de status ‘in afwachting’ (pending) na een bepaalde tijd annuleert.

De WooCommerce ‘woocommerce_cancel_unpaid_orders()‘ functie regelt het annuleren van bestellingen met de status ‘in afwachting’. De werking van deze functie is te beïnvloeden met 2 instellingen, namelijk de ‘Voorraadbeheer’ (Manage Stock) en ‘Voorraad behouden (minuten)’ (Hold Stock (minutes)) instellingen. Op het moment dat voorraadbeheer is ingeschakeld en het aantal minuten van het vasthouden van de voorraad groter is dan 0 zullen bestellingen de status ‘in afwachting’ automatisch geannuleerd worden.

In principe zou een succesvolle iDEAL-betaling er direct voor moeten zorgen dat de WooCommerce bestellingstatus wordt bijgewerkt van ‘in afwachting’ (pending) naar ‘in verwerking’ (processing). In het geval van iDEAL Basic gebeurd dit echter niet als bezoekers vanuit iDEAL niet terug keren naar de webwinkel. WooCommerce gebruikers die werken met de iDEAL Basic variant adviseer ik daarom om de “Voorraad behouden (minuten)” instelling uit te schakelen.

Voorraad behouden (voor onbetaalde bestellingen) voor x minuten. Wanneer deze limiet is bereikt zal de in afwachting bestelling geannuleerd worden. Laat leeg om uit te schakelen.

WooCommerce voorraadbeheer iDEAL Basic

Het is immers niet netjes als klanten na een succesvolle iDEAL-betaling een uur later de melding krijgen dat de bestelling is geannuleerd.

WooCommerce ‘Sale!’ tekst wijzigen

In het bericht “WooCommerce ‘Toevoegen aan winkelwagen’ tekst wijzigen” beschreef ik al hoe de “Toevoegen aan winkelwagen” tekst gewijzigd kan worden. In dit bericht is te lezen hoe de “Sale!” tekst gewijzigd kan worden.

WooCommerce "Sale!" tekst wijzigen

De WooCommerce ontwikkelaars passen de filter ‘woocommerce_sale_flash’ toe op de “Sale!” tekst waardoor deze eenvoudig is aan te passen. In onderstaande code fragment is te zien hoe dit gerealiseerd kan worden:

Bovenstaande code kan toegevoegd worden aan het WordPress functies thema bestand (functions.php). Vaak kan de code zonder problemen aan het eind van dit bestand toegevoegd worden. Als je niet werkt met een maatwerk thema dan kan het overigens handig zijn om deze toevoeging binnen een child thema of plugin te definiëren. Op die manier kun je zonder problemen je thema blijven updaten.

PHP private/protected eigenschappen aanpassen

Binnnen de Pronamic iDEAL plugin breiden we verschillende WordPress plugins uit met de iDEAL gateway. Zo voorzien we ook de Shopp webwinkel plugin voor WordPress van een iDEAL gateway module.

De Shopp ontwikkelaars hebben het echter niet eenvoudig gemaakt om vanuit een andere WordPress plugin betalingsgateways toe te voegen. In de Pronamic iDEAL plugin moeten we daarom op een omslachtige manier te werken gaan om dit toch te realiseren.

Hoe we dit gerealiseerd hebben voor Shopp versie 1.0 tot 1.2.9 is te zien in het volgende Pronamic iDEAL bestand:

https://github.com/pronamic/wp-pronamic-ideal/blob/2.3.1/classes/Pronamic/Shopp/IDeal/AddOn.php#L51

In de recente gelanceerde Shopp versie 1.3 functioneerde deze code echter niet meer correct. De Shopp ontwikkelaars hebben in het inladen van modules namelijk flink over de kop gegooid. Na de Shopp code van versie 1.3 helemaal doorgelopen hadden kwamen we al snel tot de conclusie dat de Shopp ontwikkelaars het ons vrij lastig hebben gemaakt.

De Shopp ontwikkelaars hebben vrijwel geen WordPress filters of acties beschikbaar gesteld om betalingsgateways vanaf andere locaties in te laden.  Wel worden binnen Shopp betalingsgateways nu vanaf 2 loacties ingeladen, namelijk:

  • /wp-content/plugins/shopp/gateways
  • /wp-content/shopp-addons

https://github.com/ingenesis/shopp/blob/1.3/core/model/Gateway.php#L453

Nu zou je denken dat daar dan eenvoudig een 3e locatie aan toegevoegd kan worden, maar dat was helaas niet het geval. De paden waren de betalingsgateways vanuit worden geladen stonden namelijk vast in de code en kunnen niet aangepast worden.

Uiteindelijk kwamen op het idee om de paden uit te breiden met behulp van de PHP Refelection bibliotheek. Met behulp van deze bibliotheek is het mogelijk om niet toegankelijke eigenschappen van classes/objecten wel toegankelijk te maken.

Via de volgende code konden we zo een nieuwe gateway moduels locatie toevoegen aan de Shopp plugin:

global $Shopp;

$class = new ReflectionClass( 'GatewayModules' );

$property = $class->getProperty( 'paths' );
$property->setAccessible( true );

$paths = $property->getValue( $Shopp->Gateways );
// @see https://github.com/ingenesis/shopp/blob/1.3/Shopp.php#L193
$paths[] = Pronamic_WordPress_IDeal_Plugin::$dirname . '/classes/Pronamic/Shopp/Gateways';

$property->setValue( $Shopp->Gateways, $paths );

WordCamp Europe 2013 zaterdag 5 oktober

Afgelopen weekend hebben we met Pronamic WordCamp Europe 2013 in Leiden bezocht. Hier hebben we verschillende presentaties bijgewoond en weer flink wat inspiratie en ideeën opgedaan. In dit bericht kort per presentatie enkele punten die ik interessant vond.

Zaterdag 5 oktober

Behind the Scenes at Smashing Magazine door Vitaly Friedman

Quality content is expensive

Better Site Stacks with Composer door Andrey “Rarst” Savchenko

De presentatie van Rarst is terug te vinden op de volgende webpagina:
http://composer.rarst.net/slides/

…a lot of professionals are running professional sites like they are still hobbyists.

Mark Jaquith #

The Life of a Theme door Tammie Lister

De presentatie van Tammie Lister is terug te vinden op de volgende webpagina:
https://speakerdeck.com/tammielis/the-life-of-a-theme

 Start » Plan » Moodboard » Styleguide » Schets » Wireframes » Ontwikkel » Filter » Test » Lanceer » Verfijn

Is the Freemium Model Right for Your Plugin? door Kim Gjerstad

De presentatie van Kim Gjerstad is terug te vinden op de volgende pagina:
http://www.slideshare.net/kgjerstad/is-the-freemium-plugin-right-for-your-plugin

Update regularly

Unlocking Enterprise with WordPress door David Coveney

De presentatie van David Coveney is terug te vinden op de volgende pagina:
http://www.slideshare.net/interconnectit/unlocking-enterprise-with-wordpress

WordPress is “Enterprise Ready!”

From plugin developer to running a successful WordPress business: A ManageWP Case Study

Writing Secure WordPress Code

Meer

WordPress oEmbed en de Vimeo API (Froogaloop)

De videoplayer van Vimeo kan met behulp van JavaScript aangestuurd worden. Op de JavaScript API pagina van Vimeo is hier meer informatie over te vinden. Ook is de kleine JavaScript bibliotheek Froogaloop erg handig om hiervoor te gebruiken.

Om gebruik van te maken van de Vimeo JavaScript API moet echter de embed code aangepast worden. Ze moet de video van de URL in de iframe uitgebreid worden met een ‘api’ parameter.

http://player.vimeo.com/video/VIDEO_ID?api=1

Als je meerdere URL’s op 1 pagina hebt ingevoerd moet daar ook nog een ‘player_id’ parameter aan toegevoegd worden:

http://player.vimeo.com/video/VIDEO_ID?api=1&player_id=vimeoplayer

Helaas ondersteund WordPress en Vimeo oEmbed deze parameters nog niet. Dit is echter eenvoudig te corrigeren met behulp van de volgende fiter functies. Met behulp van de eerste filter voegen we de ‘api’ en ‘player_id’ parameter toe aan de video URL:

In de tweede filter functie zorgen we dat het ‘iframe’ element dezelfde ‘id’ attribuut krijgt als de ‘player_id’:

Vervolgens kunnen we de volgende shortcode gebruiken om gebruik te maken van WordPress oEmbed en de Vimeo API en player ID:

[embed player_id="uniqid"]http://vimeo.com/31215588[/embed]