Voor veel WordPress-projecten gebruiken we tegenwoordig aangepaste berichttypen. Het ontwikkelteam van WordPress heeft enkele handige methoden ontwikkeld om ze in uw projecten te integreren. Maar als u vaak aangepaste berichttypen, taxonomieën en metaboxen gebruikt, is het vrij waarschijnlijk dat u zichzelf gaat herhalen. Daarom gaan we de kracht van deze WordPress-functies gebruiken om een krachtigere klasse te bouwen, die we kunnen gebruiken om snel posttypen, taxonomieën en metaboxen te registreren.
Dit is hoe we onze klas noemen als het klaar is.
include ( 'custom-post-type.php'); $ book = new Custom_Post_Type ('Book'); $ book-> add_taxonomy ('categorie'); $ book-> add_taxonomy ('auteur'); $ book-> add_meta_box ('Book Info', array ('Year' => 'text', 'Genre' => 'text')); $ book-> add_meta_box ('Author Info', array ('Name' => 'text', 'Nationality' => 'text', 'Birthday' => 'text'));
We beginnen met het maken van de klasse, belangrijkste eigenschappen, constructor en methoden. In deze tutorial zullen we ze vullen met onze programmeerlogica.
class Custom_Post_Type public $ post_type_name; public $ post_type_args; public $ post_type_labels; / * Klasseconstructor * / public function __construct () / * Methode die het berichttype registreert * / public function register_post_type () / * Methode om de taxonomie aan het berichttype te koppelen * / public function add_taxonomy () / * Voeg metaboxen toe aan het berichttype * / public function add_meta_box () / * Luistert naar wanneer het berichttype wordt opgeslagen * / public function save ()
Binnen de constructor creëren we enkele belangrijke variabelen, die binnen de hele klas worden gebruikt. We bellen ook add_action
om het berichttype te registreren en we luisteren wanneer het berichttype wordt opgeslagen, zodat we de metadata van onze post kunnen opslaan. Als het berichttype bestaat, de add_action
is niet geroepen, maar de $ post_type_name
is ingesteld, zodat we er taxonomieën en metaboxen aan kunnen toevoegen.
publieke functie __construct ($ name, $ args = array (), $ labels = array ()) // Stel enkele belangrijke variabelen $ this-> post_type_name = strtolower in (str_replace (", '_', $ naam)); $ this-> post_type_args = $ args; $ this-> post_type_labels = $ labels; // Actie toevoegen om het berichttype te registreren, als het berichttype nog niet bestaat als (! post_type_exists ($ this-> post_type_name)) add_action ( 'init', array (& $ this, 'register_post_type')); // Luister naar het save bericht hook $ this-> save ();
Binnen de register_post_type
methode, die wordt aangeroepen door de add_action
in de constructor bepalen we eerst de naam (hoofdletter) en het meervoud. Met deze naam en meervoud maken we onze labels voor het berichttype en overschrijven (en samenvoegen) ze met de gegeven labels uit de $ This-> post_type_labels
variabel. Vervolgens maken we onze argumenten met hetzelfde principe.
public function register_post_type () // Capitiliseer de woorden en maak het meervoud $ name = ucwords (str_replace ('_', ", $ this-> post_type_name)); $ plural = $ name. 's'; // We stellen de standaardlabels op basis van de naam van het berichttype en meervoud We overschrijven ze met de opgegeven labels. $ labels = array_merge (// Standaardarray ('naam' => _x ($ meervoud, 'berichttype algemene naam'), 'singular_name '=> _x ($ naam,' berichttype enkelvoudige naam '),' add_new '=> _x (' Nieuw toevoegen ', strtolower ($ naam)),' add_new_item '=> __ (' Nieuw toevoegen '. $ naam) , 'edit_item' => __ ('Edit'. $ name), 'new_item' => __ ('New'. $ name), 'all_items' => __ ('All'. $ meervoud), 'view_item' = > __ ('View'. $ Name), 'search_items' => __ ('Search'. $ Plural), 'not_found' => __ ('No'. Strtolower ($ plural). 'Found'), 'not_found_in_trash '=> __ (' No '. Strtolower ($ meervoud).' Gevonden in Trash '),' parent_item_colon '=> ",' menu_name '=> $ meervoud), // Gezien labels $ this-> post_type_labels); // Hetzelfde principe als de labels. We stellen enkele standaardwaarden in en overschrijven ze met de gegeven argumenten. $ args = array_merge (// Standaardarray ('label' => $ meervoud, 'labels' => $ labels, 'public' => true, 'show_ui' => true, 'supports' => array ('title' , 'editor'), 'show_in_nav_menus' => true, '_builtin' => false,), // Given args $ this-> post_type_args); // Registreer het berichttype register_post_type ($ this-> post_type_name, $ args);
Eerst controleren we of het name $
parameter is leeg. Als dat zo is, doen we niets. Wanneer dat niet het geval is, maken we drie variabelen waarin we de informatie voor de taxonomie opslaan: $ taxonomy_name
, $ taxonomy_labels
en $ taxonomy_args
.
openbare functie add_taxonomy ($ naam, $ args = array (), $ labels = array ()) if (! empty ($ name)) // We moeten de naam van het posttype kennen, zodat de nieuwe taxonomie kan worden bijgevoegd ernaar toe. $ post_type_name = $ this-> post_type_name; // Taxonomie-eigenschappen $ taxonomy_name = strtolower (str_replace (", '_', $ name)); $ taxonomy_labels = $ labels; $ taxonomy_args = $ args; / * Meer code komt eraan * /
Nadat we de eerste controles hebben uitgevoerd en vervolgens een aantal variabelen hebben ingesteld, gaan we het berichttype registreren. Maar eerst controleren we of de taxonomie al bestaat.
if (! taxonomy_exists ($ taxonomy_name)) / * Maak taxonomie aan en koppel deze aan het objecttype (berichttype) * / else / * De taxonomie bestaat al. We gaan de bestaande taxonomie koppelen aan het objecttype (berichttype) * /
Als de taxonomie niet bestaat, registreren we deze. We gebruiken een add_action
, maar niet op de normale manier. Normaal gesproken is de tweede parameter van de add_action
is de naam van een functie, maar omdat we elke keer andere parameters gebruiken, gaan we een naamloze functie passeren (Notitie: deze functie vereist PHP 5.3+) en gebruik de gebruik()
functie. Met de gebruik()
functie kunnen we variabelen doorgeven aan de naamloze functie. Deze keer moeten we slagen $ taxonomy_name
, $ post_type_name
en $ taxonomy_args
om de taxonomie te registreren.
// Capitiliseer de woorden en maak het meervoud $ name = ucwords (str_replace ('_', ", $ name)); $ plural = $ name. 'S'; // Standaardlabels, overschrijf ze met de gegeven labels. $ labels = array_merge (// Standaardarray ('name' => _x ($ meervoud, 'taxonomy general name'), 'singular_name' => _x ($ name, 'taxonomy singular name'), 'search_items' => __ ( 'Zoeken'. $ Meervoud), 'all_items' => __ ('Alle'. $ Meervoud), 'parent_item' => __ ('Bovenliggende'. $ Naam), 'parent_item_colon' => __ ('Bovenliggende'. $ name. ':'), 'edit_item' => __ ('Edit'. $ name), 'update_item' => __ ('Update'. $ name), 'add_new_item' => __ ('Voeg nieuw toe'. $ name), 'new_item_name' => __ ('Nieuw'. $ naam. 'Naam'), 'menu_name' => __ ($ naam),), // Gegeven labels $ taxonomy_labels); // Standaardargumenten, overschreven met de gegeven argumenten $ args = array_merge (// Standaardarray ('label' => $ meervoud, 'labels' => $ labels, 'public' => true, 'show_ui' => true, 'show_in_nav_menus' => true, '_builtin' => false,), // Gezien $ taxonomy_args); // Voeg de taxonomie toe aan het berichttype add_action ('init', function () gebruik ($ taxonomy_name, $ post_type_name, $ args) register_taxonomy ($ taxonomy_name, $ post_type_name, $ args); );
Wanneer de taxonomie niet bestaat, koppelen we deze alleen aan ons berichttype. Net als voorheen gebruiken we een naamloze functie en de gebruik()
functie. Deze keer hoeven we alleen maar door te geven $ taxonomy_name
en $ post_type_name
.
add_action ('init', function () gebruik ($ taxonomy_name, $ post_type_name) register_taxonomy_for_object_type ($ taxonomy_name, $ post_type_name););
Voor het registreren van metaboxen hebben we de naam van het posttype nodig, dus eerst bepalen we dat. Daarna hebben we enkele variabelen nodig voor de metabox zelf en maken we de aangepaste meta-velden globaal, zodat we ze kunnen openen in de opslaghaak. We zullen hier niet te veel details bespreken, omdat Tammy Hart al een zeer nuttige tutorial over herbruikbare metaboxen heeft gemaakt.
openbare functie add_meta_box ($ title, $ fields = array (), $ context = 'normal', $ priority = 'default') if (! empty ($ title)) // We moeten de naam van het berichttype opnieuw weten $ post_type_name = $ this-> post_type_name; // Meta-variabelen $ box_id = strtolower (str_replace (", '_', $ title)); $ box_title = ucwords (str_replace ('_',", $ title)); $ box_context = $ context; $ box_priority = $ prioriteit; // Maak de velden globale globale $ custom_fields; $ custom_fields [$ title] = $ velden; / * Meer code komt eraan * /
Wanneer we de variabelen en globalen instellen, registreren we de metabox met een add_action
. Zoals eerder gebruiken we een naamloze functie. Deze keer hebben we nodig $ box_id
, $ box_title
, $ post_type_name
, $ box_context
, $ box_priority
en $ velden
.
add_action ('admin_init', function () gebruik ($ box_id, $ box_title, $ post_type_name, $ box_context, $ box_priority, $ fields) add_meta_box ($ box_id, $ box_title, function ($ post, $ data) global $ post ; // Nonce veld voor enige validatie wp_nonce_field (plugin_basename (__FILE__), 'custom_post_type'); // Krijg alle invoer van $ data $ custom_fields = $ data ['args'] [0]; // Krijg de opgeslagen waarden $ meta = get_post_custom ($ post-> ID); // Controleer de array en loop er doorheen als (! empty ($ custom_fields)) / * Loop door $ custom_fields * / foreach ($ custom_fields als $ label => $ type) $ field_id_name = strtolower (str_replace (", '_', $ data ['id'])). '_'. strtolower (str_replace (", '_', $ label)); echo ''; , $ post_type_name, $ box_context, $ box_priority, array ($ fields)); );
Bewaar alle metadata van de post. We lopen er doorheen en gebruiken de global $ custom_fields
. Dit is ook een snelle verslaggeving, zie de tutorial van Tammy Hart over herbruikbare metaboxen.
openbare functie opslaan () // De naam van het berichttype opnieuw nodig $ post_type_name = $ this-> post_type_name; add_action ('save_post', function () gebruik ($ post_type_name) // Weigeren de WordPress autosolefunctie als (defined ('DOING_AUTOSAVE') && DOING_AUTOSAVE) terugkeren; if (! wp_verify_nonce ($ _POST ['custom_post_type'], plugin_basename ( __FILE__))) return; global $ post; if (isset ($ _POST) && isset ($ post-> ID) && get_post_type ($ post-> ID) == $ post_type_name) global $ custom_fields; // Doorloop elk meta box foreach ($ custom_fields als $ title => $ velden) // Loop door alle velden voor elke ($ velden als $ label => $ type) $ field_id_name = strtolower (str_replace (", '_', $ title) ). '_'. strtolower (str_replace (", '_', $ label)); update_post_meta ($ post-> ID, $ field_id_name, $ _POST ['custom_meta'] [$ field_id_name]);) ;
Zoals je kunt zien, gebruiken we het strtolower (str_replace (", '_', $ string))
en ucwords (str_replace ('_', ", $ string))
een aantal keren. De reden om deze klasse te maken is dat we onszelf niet herhalen, dus we willen dat ook niet in dit deel doen. Dat is waarom we een aantal hulpmethoden maken. Op deze manier kunnen we dit doen: $ name = self: verfraaien ($ string);
in plaats van $ name = strtolower (str_replace (", '_', $ title));
openbare statische functie verfraaien ($ string) return ucwords (str_replace ('_', ", $ string)); public static function uglify ($ string) return strtolower (str_replace (", '_', $ string)) ;
Een ander punt is de meervoudsvormen die we creëren. We maken ze gewoon door een 's' aan het woord toe te voegen. Maar wat gebeurt er als het woord eindigt met een 'j'? Om deze reden maken we een hulpmethode om de meervoudsvorm van een woord te bepalen. Nu kunnen we dit eenvoudig doen: $ plural = self :: pluralize ($ string)
en de meervoudsvorm van ons woord zal worden bepaald.
openbare statische functie pluralize ($ string) $ last = $ string [strlen ($ string) - 1]; if ($ last == 'y') $ cut = substr ($ string, 0, -1); // convert y to ies $ plural = $ cut. 'S'; else // bevestig een s $ meervoud = $ string. 'S'; return $ meervoud;
En nu zijn we klaar. U kunt deze klasse nu gebruiken om eenvoudig berichttypen, taxonomieën en metaboxen te registreren. Als je suggesties of vragen hebt, laat dan een reactie achter, zodat we erover kunnen praten. Ik hoop je de volgende keer te zien!
Ik wil ook graag Jeffrey Way een compliment geven. Ik gebruikte zijn klas als inspiratie voor mijn klas en voor deze tutorial. Ook zou ik Tammy Hart wat op prijs willen stellen, voor het bouwen van de herbruikbare metabox-tutorial. Bekijk hun werk.