For mange WordPress-prosjekter i disse dager bruker vi egendefinerte innleggstyper. WordPress-utviklingslaget laget noen praktiske metoder for å integrere dem i prosjektene dine. Men når du bruker egendefinerte innleggstyper, taksonomier og meta-bokser ofte, er det ganske sannsynlig at du skal gjenta deg selv. Det er derfor vi skal bruke kraften i disse WordPress-funksjonene til å bygge en kraftigere klasse, som vi kan bruke til å raskt registrere posttyper, taksonomier og meta-bokser.
Slik kaller vi vår klasse når den er ferdig.
omfatte ( 'custom-post-type.php'); $ bok = ny Custom_Post_Type ('Book'); $ bok-> add_taxonomy ('kategori'); $ bok-> add_taxonomy ('author'); $ book-> add_meta_box ('Book Info', array ('Year' => 'text', 'Genre' => 'tekst')); $ book-> add_meta_box ('Forfatter Info', array ('Name' => 'text', 'Nationalitet' => 'tekst', 'Bursdag' => 'tekst'));
Vi starter med å skape klassen, hovedegenskapene, konstruktøren og metodene. I denne opplæringen vil vi fylle dem med vår programmeringslogikk.
klasse Custom_Post_Type offentlig $ post_type_name; offentlig $ post_type_args; offentlig $ post_type_labels; / * Klassekonstruktør * / offentlig funksjon __construct () / * Metode som registrerer posttypen * / offentlig funksjon register_post_type () / * Metode for å legge taksonomien til posttypen * / offentlig funksjon add_taxonomy () / * Føyer meta bokser til posttypen * / offentlig funksjon add_meta_box () / * Lytter etter når posttypen er lagret * / offentlig funksjon lagre ()
Innenfor konstruktøren lager vi noen viktige variabler, som brukes i hele klassen. Vi ringer også ADD_ACTION
å registrere posttypen og vi lytter etter når posttypen blir lagret, slik at vi kan lagre innleggets metadata. Hvis posttype eksisterer, vil ADD_ACTION
er ikke kalt, men $ post_type_name
er satt, så vi kan legge til taksonomier og meta bokser til den.
offentlig funksjon __construct ($ navn, $ args = array (), $ labels = array ()) // Sett noen viktige variabler $ this-> post_type_name = strtolower (str_replace ("," _ ", $ navn)); this-> post_type_args = $ args; $ this-> post_type_labels = $ etiketter; // Legg til handling for å registrere posttypen, hvis posttypen ikke allerede eksisterer hvis (! post_type_exists ($ this-> post_type_name)) add_action 'init', array (& $ dette, 'register_post_type')); // Lytt etter lagre innleggskroken $ this-> save ();
Innen register_post_type
metode, som blir kalt av ADD_ACTION
i konstruktøren bestemmer vi først navnet (kapitalisert) og flertallet. Med dette navnet og flertallet bygger vi våre etiketter for posttypen og overskriver (og fusjonerer) dem med de oppgitte etikettene fra $ Dette-> post_type_labels
variabel. Da skaper vi våre argumenter med samme prinsipp.
offentlig funksjon register_post_type () // Kapitiliser ordene og gjør det plural $ name = ucwords (str_replace ('_', '$ $-- post_type_name)); $ plural = $ navn.' s '; // Vi setter standard etiketter basert på posttype navn og flertall. Vi overskriver dem med de oppgitte etikettene. $ labels = array_merge (// Standard array ('name' => _x ($ flertall, 'posttype generell navn'), 'singular_name 'add_new' => _x ('Add New', strtolower ($ navn)), 'add_new_item' => __ ('Legg til nytt'. $ navn) , 'edit_item' => __ ('Rediger'. $ navn), 'new_item' => __ ('Nytt'. $ navn), 'all_items' => __ ('Alle'. $ flertall), 'view_item' = > __ ('Se'. $ Navn), 'search_items' => __ ('Søk'. $ Flertall), 'not_found' => __ ('Nei' .strtolower ($ flertall). 'Funnet'), 'not_found_in_trash '=> __ (' Nei '.strtolower ($ plural).' Found in Trash '),' parent_item_colon '=> ",' menu_name '=> $ flertall), // Gitt etiketter $ this-> post_type_labels); // Samme prinsipp som etikettene. Vi angir noen standardverdier og overskriver dem med de oppgitte argumentene. $ args = array_merge (// Standard array ('label' => $ flertall, 'labels' => $ etiketter, 'public' => true, 'show_ui' => true, 'supports' => , 'editor'), 'show_in_nav_menus' => true, '_builtin' => false,), // Gitt args $ this-> post_type_args); // Registrer posttypen register_post_type ($ this-> post_type_name, $ args);
Først sjekker vi om $ name
parameteren er tom. Når det er, gjør vi ingenting. Når det ikke er det, oppretter vi tre variabler der vi lagrer informasjonen for taksonomien: $ taxonomy_name
, $ taxonomy_labels
og $ taxonomy_args
.
offentlig funksjon add_taxonomy ($ navn, $ args = array (), $ labels = array ()) hvis (! tom ($ navn)) // Vi trenger å vite posttype navnet, så den nye taksonomien kan vedlegges til det. $ post_type_name = $ this-> post_type_name; // Taxonomy egenskaper $ taxonomy_name = strtolower (str_replace (", '_', $ navn)); $ taxonomy_labels = $ etiketter; $ taxonomy_args = $ args; / * Mer kode kommer * /
Etter at vi har gjort de første kontrollene og sett inn noen variabler, skal vi registrere posttypen. Men først kontrollerer vi om taksonomien allerede eksisterer.
hvis (! taxonomy_exists ($ taxonomy_name)) / * Opprett taksonomi og legg det til objekttype (posttype) * / else / * Taksonomien eksisterer allerede. Vi skal legge til den eksisterende taksonomien til objekttype (posttype) * /
Hvis taksonomien ikke eksisterer, registrerer vi det. Vi bruker en ADD_ACTION
, men ikke på vanlig måte. Normalt er den andre parameteren til ADD_ACTION
er navnet på en funksjon, men siden vi bruker forskjellige parametere hver gang, skal vi passere en navnløs funksjon (Merk: denne funksjonen krever PHP 5,3 +) og bruk bruk()
funksjon. Med bruk()
funksjon vi kan passere variabler til den navnløse funksjonen. Denne gangen må vi passere $ taxonomy_name
, $ post_type_name
og $ taxonomy_args
å registrere taksonomien.
// Capitiliser ordene og gjør det plural $ name = ucwords (str_replace ('_', '$ name)); $ plural = $ navn.' S '; // Standard etiketter, overskrive dem med de oppgitte etikettene. $ etiketter = array_merge (// standard array ('name' => _x ($ flertall, 'taxonomy generell navn'), 'singular_name' => _x ($ navn, 'taxonomy singular name'), 'search_items' => __ 'Search'. $ Plural), 'all_items' => __ ('Alle'. $ Flertall), 'parent_item' => __ ('Parent'. $ Navn), 'parent_item_colon' => __ ('Parent'. $ navn. ':'), 'edit_item' => __ ('Rediger'. $ navn), 'update_item' => __ ('Oppdater'. $ navn), 'add_new_item' => __ ('Legg til nytt'. navn), 'new_item_name' => __ ('New'. $ navn. 'Navn'), 'menu_name' => __ ($ navn),), // Gitt etiketter $ taxonomy_labels); // Standardargumenter overskrevet med de angitte argumentene $ args = array_merge (// Standard array ('label' => $ plural, 'labels' => $ etiketter, 'public' => true, 'show_ui' => true, 'show_in_nav_menus' => '_builtin' => false,), // Gitt $ taxonomy_args); // Legg til taksonomien til posttype add_action ('init', funksjon () bruk ($ taxonomy_name, $ post_type_name, $ args) register_taxonomy ($ taxonomy_name, $ post_type_name, $ args); );
Når taksonomien ikke eksisterer, knytter vi bare den til vår posttype. Akkurat som før bruker vi en navnløs funksjon og bruk()
funksjon. Denne gangen trenger vi bare å passere $ taxonomy_name
og $ post_type_name
.
add_action ('init', function () bruk ($ taxonomy_name, $ post_type_name) register_taxonomy_for_object_type ($ taxonomy_name, $ post_type_name););
For registrering av metakasser trenger vi posttype-navnet, så først bestemmer vi det. Deretter trenger vi noen variabler for meta-boksen selv, og vi lager de tilpassede metafeltene globalt, slik at vi får tilgang til dem i lagringskroken. Vi vil ikke dekke for mye detalj her, fordi Tammy Hart gjorde en veldig nyttig opplæring om gjenbrukbare metakasser allerede.
offentlig funksjon add_meta_box ($ title, $ fields = array (), $ context = 'normal', $ priority = 'default') if (! tomt ($ title)) // Vi må vite Post Type Name igjen $ post_type_name = $ this-> post_type_name; // Meta variabler $ box_id = strtolower (str_replace (", '_', $ title)); $ box_title = ucwords (str_replace ('_', ', $ title)); $ box_context = $ kontekst; $ box_priority = $ priority; // Gjør feltene globale globale $ custom_fields; $ custom_fields [$ title] = $ felt; / * Mer kode kommer * /
Når vi setter variablene og globals, registrerer vi meta-boksen med en ADD_ACTION
. Som før bruker vi en navnløs funksjon. Denne gangen trenger vi $ box_id
, $ box_title
, $ post_type_name
, $ box_context
, $ box_priority
og $ felt
.
add_action ('admin_init', funksjon () bruk ($ box_id, $ box_title, $ post_type_name, $ box_context, $ box_priority, $ felt) add_meta_box ($ box_id, $ box_title, funksjon ($ post, $ data) global $ post ; // Nonce-feltet for noen validering wp_nonce_field (plugin_basename (__FILE__), 'custom_post_type'); // Få alle innganger fra $ data $ custom_fields = $ data ['args'] [0]; // Få de lagrede verdiene $ meta = get_post_custom ($ post-> ID); // Sjekk arrayet og loop gjennom det hvis (! tomt ($ custom_fields)) / * Gå gjennom $ custom_fields * / foreach ($ custom_fields as $ label => $ type) $ field_id_name = strtolower (str_replace ("_ ', $ data [' id '])).' _ '.strtolower (str_replace (",' _ ', $ label)'; , $ post_type_name, $ box_context, $ box_priority, array ($ felt)); );
Lagre alle innleggets metadata. Vi løp gjennom dem, ved hjelp av det globale $ custom_fields
. Dette er også en rask dekning, se Tammy Harts veiledning om gjenbrukbare metakasser.
offentlig funksjon lagre () // Trenger posttype navnet igjen $ post_type_name = $ this-> post_type_name; add_action ('save_post', funksjon () bruk ($ post_type_name) // Avvis WordPress autosave-funksjonen hvis (definert ('DOING_AUTOSAVE') && DOING_AUTOSAVE) returnere, hvis (! wp_verify_nonce ($ _POST ['custom_post_type'], plugin_basename __FILE__)) returnere; global $ post; if (isset ($ _POST) && isset ($ post-> ID) && get_post_type ($ post-> ID) == $ post_type_name) global $ custom_fields; // Gå gjennom hver meta box foreach ($ custom_fields som $ title => $ felt) // Gå gjennom alle feltene foreach ($ felt som $ 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]); ;
Som du kan se bruker vi strtolower (str_replace (", '_', $ string))
og ucwords (str_replace ('_', ', $ string))
en rekke ganger. Årsaken til å skape denne klassen er at vi ikke gjentar oss selv, så vi vil heller ikke gjøre det i denne delen. Derfor lager vi noen hjelpemetoder. På denne måten kan vi gjøre dette: $ name = self :: beautify ($ string);
i stedet for $ name = strtolower (str_replace (", '_', $ title));
offentlig statisk funksjon beautify ($ string) return ucwords (str_replace ('_', '$ string)) offentlig statisk funksjon uglify ($ string) return strtolower (str_replace (",' _ ', $ string)) ;
Et annet poeng er flertallsformene vi lager. Vi lager bare dem ved å legge til en 's' til ordet. Men hva skjer når ordet avsluttes med en 'y'? Av denne grunn oppretter vi en hjelpemetode for å bestemme flertallsformen til et ord. Nå kan vi enkelt gjøre dette: $ plural = selv :: pluralize ($ string)
og flertallsformen av vårt ord vil bli bestemt.
offentlig statisk funksjon pluralize ($ string) $ last = $ string [strlen ($ string) - 1]; hvis ($ siste == 'y') $ cut = substr ($ streng, 0, -1); // konvertere y til ies $ plural = $ cut. 'ies'; ellers // bare legg til en s $ plural = $ streng. 'S'; returnere $ flertall;
Og nå er vi ferdige. Du kan nå bruke denne klassen til å enkelt registrere posttyper, taksonomier og metakasser. Hvis du har noen forslag eller spørsmål, bare la en kommentar, så vi kan snakke om det. Håper å se deg neste gang!
Også, jeg vil gjerne gi æren til Jeffrey Way. Jeg brukte klassen hans som inspirasjon for min klasse og for denne opplæringen. Også, jeg vil gjerne gi litt kreditt til Tammy Hart, for å bygge de gjenbrukbare meta-boksene. Ta en titt på deres arbeid.