Kontakt

Portfolio: Ostryweb @ Instagram.

úterý 25. prosince 2012

Vývoj Wordpress pluginu s použitím Custom Post Types

Zadáním nedávno spuštěného Wordpress pluginu pro zákazníka bylo vytvořit systém dokumentů, ke kterým je omezen přístup a mají specifickou strukturu. Nebudu popisovat celý vývoj, ale vzhledem k tomu, že v rámci daného řešení bylo nutno sáhnout po pokročilejších záležitostech jako custom post type, custom taxonomy, custom roles, nastavení capabilities atd. popíšu alespoň tyto netriviální věci.

Na konci uvádím i tipy na nástroje, frameworky a odkazy, na které jsem narazil v průběhu vývoje a buď mi pomohly, nebo bych je nejspíš použil při podobné budoucí záležitosti.

Nebudu se rozepisovat o detailech, bez reference v podobě Wordpress codexu (dále jen Codex) se určitě neobejdete.
http://codex.wordpress.org/

Custom Post Type

http://codex.wordpress.org/Post_Types
Na míru definovaný typ “dokumentu” Wordpressu s požadovanými položkami. Položky můžou být buď klasické jako známe z klasických článků a příspěvků - tzn textové políčko (v administraci jako input), pole pro větší text (textarea), ale i vyloženě custom záležitosti (color picker apod).

function muj_add_post_type() {
register_post_type( 'muj_document',
array(
'labels' => array(
'name' => 'Dokument',
'singular_name' => 'Dokument',
'add_new' => 'Přidat dokument',
'add_new_item' => 'Přidat nový dokument',
'edit' => 'Upravit',
'edit_item' => 'Upravit dokument',
'new_item' => 'Nový dokument',
'view' => 'Zobrazit',
'view_item' => 'Zobrazit dokument',
'search_items' => 'Hledat v dokumentech',
'not_found' => 'Žádný dokument nenalezen',
'not_found_in_trash' => 'Žádný dokument v koši nenalezen',
'parent' => 'Nadřazený dokument'
),
'public' => true,
'publicly_queryable' => false,
'exclude_from_search' => true,
'show_in_nav_menus' => false,
'capability_type' => 'muj_document',
'capabilities' => array(
'read_post' => 'read_muj_document',
'edit_post' => 'edit_muj_document',
'read_private_posts' => 'read_private_muj_documents',
'edit_posts' => 'edit_muj_documents',
'edit_others_posts' => 'edit_others_muj_documents',
'edit_published_posts' => 'edit_published_muj_documents',
'publish_posts' => 'publish_muj_documents',
'delete_posts' => 'delete_muj_documents',
'delete_others_posts' => 'delete_others_muj_documents',
'delete_post' => 'delete_muj_document',
),
'map_meta_cap' => true,
'menu_position' => 2,
'supports' => array( 'title', 'author', 'revisions' ),
'menu_icon' => plugins_url( 'img/menulogo.png', __FILE__ ),
'can_export' => false
)
);
}
add_action('init', 'muj_add_post_type', 0);
view raw plugin.php hosted with ❤ by GitHub


Ke kompletnímu vysvětlení odkazuju na Codex, jde o obecnou definici nového typu, definujeme jeho název, který je jeho identifikátorem v systému, popisky “labels”, chování v systému.

V ukázce kódu je zahrnuta i další záležitost:

Custom capabilities

http://codex.wordpress.org/Function_Reference/register_post_type
Vzhledem k tomu, že nám v tomto projektu nevyhovuje využití defaultních práv k postům Wordpressu (tedy je nutno oddělit psaní klasických článků a vytváření těchto dokumentů), musíme si nadefinovat názvy speciálních práv k tomuto Post Typu a napojit je na defaultní práva, aby systém věděl, co znamenají. Custom capabilities mají název podle defaultního práva pro “post”, jen místo tohoto slova vkládáme název právě našeho Post Typu. V příkladu výše “muj_document” resp “muj_documents” - toto je potřeba odlišovat dle původního vzoru.

Custom Roles

http://codex.wordpress.org/Function_Reference/add_cap
Opět nám nevyhovuje klasické rozřazení Wordpress uživatelů (Administrator, Šéfredaktor, Redaktor atd..), ale chceme uživatelům přiřazovat speciální role, které mají námi definovaná práva.

add_role( 'muj_knihovnik', 'Knihovnik', array('muj_knihovnik') );
$role = get_role('muj_knihovnik');
$role->add_cap('read');
$role->add_cap('read_muj_document');
$role->add_cap('edit_muj_document');
$role->add_cap('edit_muj_documents');
$role->add_cap('edit_others_muj_documents');
$role->add_cap('edit_published_muj_documents');
$role->add_cap('delete_muj_documents');
$role->remove_cap('publish_muj_documents');
$role->remove_cap('delete_others_muj_documents');
$role->remove_cap('upload_files');
view raw gistfile1.txt hosted with ❤ by GitHub


V prvním řádku jsme přidali do systému novou uživatelskou roli, níže pak přidáváme práva pro manipulaci s našili dokumenty (capabilities), viz výše, pro jistotu můžeme i některé capability odebrat..

Tento kus kódu je vhodné vložit do bloku instalace pluginu, aby se nespouštěl pokaždé. Tzn ho vložíme např. do funkce muj_activate(), kterou pak voláme následujícím způsobem.

register_activation_hook( __FILE__, 'muj_activate' );
view raw gistfile1.php hosted with ❤ by GitHub


Custom Taxonomy

http://codex.wordpress.org/Function_Reference/register_taxonomy
Jak jsem uvedl výše, jednou ze zásadních věcí je, že jsme schopni si nadefinovat svou strukturu dokumentu, tedy nemusí jít o klasiku v podobě názvu, úvodu, textu, kategorie a štítku, ale lze vše změnit. Kód níže zavádí nové pole Vydavatel, které funguje na principu číselníku (tzn. vlastně upravená verze štítku). Zde opět navazujeme capabilities na námi definované výše.

register_taxonomy(
'muj_document_vydavatel',
'muj_document',
array(
'labels' => array(
'name' => 'Vydavatel',
'singular_name' => 'Vydavatel',
'add_new_item' => 'Přidat nového vydavatele',
'new_item_name' => 'Nový vydavatel',
'all_items' => 'Všichni vydavatelé'
),
'update_count_callback' => '_update_post_term_count',
'show_ui' => true,
'show_tagcloud' => false,
'capabilities' => array (
'manage_terms' => 'read_private_my_documents',
'edit_terms' => 'read_private_my_documents',
'delete_terms' => 'manage_my_tables',
'assign_terms' => 'edit_others_my_documents'
)
)
);
view raw gistfile1.php hosted with ❤ by GitHub


Custom Meta Boxes

http://codex.wordpress.org/Function_Reference/add_meta_box
Pro editaci v administraci je nutné nadefinovat si ovládací prvky. Můžete opět postupovat ručně, dle Codexu. Já našel a použil framework, který ulehčuje velké množství práce.
https://github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress

Tipy

Téměř ke konci vývoje jsem narazil na Piklist, který mohl celý vývoj dost zásadně ulehčit, bohužel v dané fázi už to nemělo cenu, ale doporučuju zvážit. Framework se zdá dostatečně flexibilní a umí jednoduše nadefinovat vše, co jsem popsal výše a vyvíjel jsem “ručně”.

Pro představu doporučuju prezentaci autorů zde:
http://wordpress.tv/2012/09/04/steve-bruner-and-kevin-miller-building-powerful-websites-and-web-applications-with-piklist/

Web projektu: http://piklist.com/

Obecně velký zdroj všeho kolem těchto rozšíření Wordpressu a customizace je na blogu Justina Tadlocka, takže při studiu určitě chtě nechtě zabrousíte na http://justintadlock.com/.

Pro kontrolu nastavení práv jsem používal Justinův plugin Members. http://wordpress.org/extend/plugins/members/