Plugin development wpmeetup010

Preview:

DESCRIPTION

The presentation I gave at WordPress meetup Rotterdam.

Citation preview

PLUGIN DEVELOPMENT

#wpmeetup010

BARRY KOOIJ

Twitter : @cageNLLead Developer WordPress @ INDICIAFreelance @ CageworksPlugin developer

What The FileSub PostsContributor EDD & extensies

Core contributorModerator WPNL forum

PLUGIN DEVELOPMENT

MIJN SETUP

Device MacBook AirIDE PhpStormVersiebeheer GIT, GitHub / private server

Commandline

ALTERNATIEVEN

IDE NuSphere PhpEDGIT Bitbucket, GitLab

TowerSVN Versions / Tortoise

DEBUGGINGdefine( 'WP_DEBUG', true );

if ( WP_DEBUG ) {define( 'SCRIPT_DEBUG', true );define( 'WP_DEBUG_LOG', true );define( 'WP_DEBUG_DISPLAY', true );@ini_set( 'display_errors', 0 );

}

display_errors = On;error_reporting = E_ALL | E_STRICT;

CODE TEMPLATES

https://gist.github.com/barrykooij/7632945

WORDPRESS CORE

Open source, maak hier gebruik van!API’s, API’S, API’sFilters & Hooks

API’S

Dashboard Widgets APIDatabase APIHTTP APIFile Header APIFilesystem APIMetadata APIOptions APIPlugin APIQuicktags API

Rewrite APISettings APIShortcode APITheme Modification APITheme Customization APITransients APIWidgets APIXML-RPC WordPress API

FILTERS & HOOKS

add_action( ‘hook_name’, ‘my_function’ );

do_action( ‘hook_name’ );

JS “HOOKS” (EVENTS)

$('body').bind(’event’, function(event, the_value) {});

$('body').trigger(’event', [ value ]);

BACKWARDS COMPATABILITY

Deprecate codePas later geen unit tests aan, maar voeg unit tests toe

CODE STANDARDS

http://codex.wordpress.org/WordPress_Coding_Standards

NAMING CONVENTIONS

function some_name( $some_variable ) { [...] }

class Walker_Category extends Walker { [...] } class WP_HTTP { [...] }

my-plugin-name.phpclass-my-class.php

DATABASES

Gebruik altijd de API!$wpdb->prepare

$wpdb->prepare( "SELECT * FROM {$wpdb->posts}" WHERE `ID` = %d", $special_id );

YODA CONDITIONS

if ( true == $the_force ) { $victorious = you_will( $be );

}

A little bizarre, it is, to read. Get used to it, you will.

UNIT TESTING

PHPUnit/** * @ticket 22212 */function test_get_multiple_roles_by_user_query() {

$this->factory->user->create_many( 2, array( 'role' => 'subscriber’ ) );

$this->factory->user->create_many( 3, array( 'role' => 'editor’ ) );

$wp_user_search = new WP_User_Query( array( 'role' => array( 'subscriber’, 'editor' ) ) );

$users = $wp_user_search->get_results();$this->assertEquals( 5, count( $users ) );

}

CHANGELOG

Hou bij wat je wanneer veranderd hebt

SUPPORT

Als je iets bouwt, support het danGeef op je website je support tijden aanSupport systemen

WORDPRESS.ORG REPO

Header afbeeldingDuidelijk omschrijvingDownloads i.c.m. ratingVraag om ratings!

CONDITIONAL LOADING OF CODE

Laad code enkel waar nodig

is_admin()

DOCUMENTATION

Schrijf je code doc direct

Betere IDE suggesties

CODE

OBJECTGEORIËNTEERD

OOPSingleton pattern

class My_Plugin {

private static $instance = null;

public static function get() {

if( null == self::$instance ) {self::$instance = new self();}

return self::$instance;

}

private function __construct() {}

}

function My_Plugin() {return My_Plugin::get();

}

add_action( 'plugins_loaded', function() {My_Plugin::get(); });

PLUGIN DIR & FILE

if ( ! defined( ’X_PLUGIN_DIR' ) ) {define( 'X_PLUGIN_DIR’, plugin_dir_path( __FILE__ ) );

}

if ( ! defined( ’X_PLUGIN_FILE' ) ) {define( ’X_PLUGIN_FILE', __FILE__ );

}

PREFIXES

WordPress : PHP version 5.2.4 or greater

Namespaces : 5.3.0 or greater

Tot die tijd, prefixen.

class SP_Post_Link_Manager { [...] }

SANITIZE & ESCAPE

sanitize_titleis_emailhttp://codex.wordpress.org/Data_Validation#Input_Validation

esc_urlesc_html

CAPABILITIES

if ( ! current_user_can( SP_Cap_Manager::get_capability( $_GET['sp_post_link'] ) ) ) {

return;}

NONCES

Number used ONCE

wp_nonce_field( plugin_basename( __FILE__ ), 'sp_sortable_nonce' );

if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], plugin_basename( __FILE__ ) ) ) {

return;}

DIRECT ACCESS

if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

I18N

load_plugin_textdomain( 'sub-posts', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );

_e( ‘my-string’, ‘sub-posts’ );

Q&ATwitter @cageNLWordPress & Github: barrykooij7 januari meetup in Tilburg