I del 1 och del 2 i vår anpassade meta box template-handledningsserie lärde vi oss hur man skapar en fältmatris för att slingra igenom och skapa en anpassad metakassa med dina standardfält. Låt oss nu kasta in lite JavaScript för några snygga men mycket användbara fält.
Alla fält som vi täcker i den här handledningen kräver jQuery och jQuery UI. Tack och lov, WordPress gör det super lätt att använda dessa med wp_enqueue_script
, och från och med 3.3, är alla jQuery UI-interaktioner och widgets buntade med WordPress.
Eftersom vi arbetar på en sida som redan kalkylerar jQuery kan vi hoppa över det, men vi måste få jQuery UI Datepicker. Vi måste också skapa vårt eget stilark eftersom den nödvändiga CSS inte kommer med i WordPress ännu, även om de jobbar ut det.
om (is_admin ()) wp_enqueue_script ('jquery-ui-datepicker'); wp_enqueue_style ('jquery-ui-custom', get_template_directory_uri (). '/ css / jquery-ui-custom.css');
Vi behöver bara ladda dessa i admin, och inte på den främre änden av webbplatsen, så sätta in funktionerna i en villkorlig. Den första funktionen kallar datumpicker och laddar även jQuery UI Core. Den andra funktionen kommer att ringa vårt jquery-ui-custom.css stilark från temas css-mapp. Exemplet stilark som ingår i hämtningen i början av denna handledning kräver inte bilder. Du kan också skapa ditt eget tema för jQuery UI.
Låt oss nu titta på det arrayobjekt vi behöver lägga till i vårt $ custom_meta_fields
array vi började i del 1.
array ('label' => 'Date', 'desc' => 'En beskrivning för fältet.', 'id' => $ prefix.'date ',' type '=>' date ')
Denna array är nästan identisk med vårt textobjekt. Den har en huvudetikett, en beskrivning, ett unikt id och datatypen definieras. Vi ska bara gå med en grundläggande implementering av datumväljaren i vårt exempel här, men om du behöver krydda din användning av datumväljaren, kan du också lägga till annan information i arrayen, t.ex. det föredragna formatet, lokalisering , och datumintervall för att nämna några. Då kan du använda den informationen i följande skriptsökare som vi behöver lägga till i sidans huvud:
add_action ( 'admin_head', 'add_custom_scripts'); funktion add_custom_scripts () global $ custom_meta_fields, $ post; $ output = ''Denna bit måste läggas till utanför
$ custom_meta_fields
array och utanförshow_custom_meta_box
återuppringningsfunktion för att initiera datumväljaren på alla fält med klassen "datumpicker".// datumfall "datum": echo "
'$ Fält [ 'desc'].''; ha sönder;Denna kod kommer att läggas till efter den sista "break" i vår meta box switch.
Ibland behöver du samla ett nummer som är inställt på ett exakt intervall eller måste vara multiplar av 5. JQuery UI-reglaget är bra för det här eftersom det gör det enkelt att dra och skjuta till numret som du vill ange.
wp_enqueue_script ( 'jquery-ui-reglaget');
Se till att du ringer till js-filen genom att lägga till den till din is_admin () inslagna enqueues.
array ('label' = '' Slider ',' desc '=>' En beskrivning för fältet. ',' id '=> $ prefix.'slider', 'type' => 'slider' > '0', 'max' => '100', 'step' => '5')
Igen lägger vi till det här till vårt $ custom_meta_fields
array och det finns några speciella tillägg.
om ($ field ['type'] == 'slider') $ value = get_post_meta ($ post-> ID, $ field ['id'], true); om ($ värde == ") $ värde = $ fält ['min']; $ output. = 'jQuery (" # ". $ fält [' id '] .'- slider"). . $ värde. ', min:'. $ fält ['min']. ', max:'. $ fält ['max']. ', steg:'. $ fält ['steg'] funktion (händelse, ui) jQuery ("#". $ fält ['id']. '") .val (ui.value););';
Lägg till denna bit av kod till slingan i add_custom_scripts
funktion vi skapade i den sista fälttypen. Detta lägger till den anpassade jQuery vi behöver för att konfigurera reglaget.
// slider case 'slider': $ värde = $ meta! = "? $ meta: '0'; echo '
'$ Fält [ 'desc'].''; ha sönder;
Återigen använder vi bara ett textfält för att få glidarens värde.
Sedan introduktionen av Post-miniatyrbilder är det inte något vi gör mycket, men en gång i taget finns det en tid när du behöver ställa in en annan bild än miniatyrbilden, särskilt när du bygger en plugin som tar hänsyn till att användarens tema kanske inte stöder efter miniatyrer.
Detta fält kommer att lägga till möjligheten att ladda upp en bild eller välja en från media uppladdning, visa en förhandsvisning av bilden och spara ID för maximala användningsalternativ.
För att få vår knapp att utlösa medieuppladdaren måste vi knyta in den med lite javascript.
jQuery (funktion (jQuery) jQuery ('. custom_upload_image_button'). klicka (funktion () formfield = jQuery (detta) .siblings ('. custom_upload_image'); förhandsgranska = jQuery (this) .siblings ('. custom_preview_image') ; tb_show ("," media-upload.php? typ = bild & TB_iframe = true "); window.send_to_editor = funktion (html) imgurl = jQuery ('img', html) .attr ('src'); classes = jQuery ('img', html) .attr ('class'); id = classes.replace (/(.*?) wp-image- /, "); formfield.val (id); preview.attr , imgurl); tb_remove (); return false;); jQuery ('. custom_clear_image_button'). klicka (funktion () var defaultImage = jQuery (this) .parent (). syskon ('. custom_default_image'). (); jQuery (this) .parent () .siblings ('. custom_upload_image') .val ("); jQuery (this) .parent (). syskon ('. custom_preview_image'). Attr ('src', defaultImage) ; return false;););
Sätt dessa i en anpassad js-fil och sköt den i dina is_admin () inslagna enqueues.
wp_enqueue_script ('custom-js', get_template_directory_uri (). '/ js / custom-js.js');
Den första funktionen hittar den knapp som vi ska skapa snart med klassen "custom_upload_image_button" "och förformar några olika saker på klick.
Den andra funktionen berättar länken vi klassar som "custom_clear_image_button" för att radera både värdet på formulärfältet och återställa förhandsvisningen till vår standardbild.
array ('name' => 'Image', 'desc' => 'En beskrivning för fältet.', 'id' => $ prefix.'image ',' type '=>' image ')
Vi behöver bara grundläggande information för detta fält.
// image case 'image': $ image = get_template_directory_uri (). '/ images / image.png'; eko "'$ Bild.''; om ($ meta) $ image = wp_get_attachment_image_src ($ meta, 'medium'); $ image = $ image [0]; eko
Ta bort bild
'$ Fält [ 'desc'].''; ha sönder;
Vi har några saker på gång här, men med det sätt vi har skrivit javascript, så borde det fungera ganska bra oavsett hur många bildfält du lägger till.
När du verkligen går in på att använda anpassade metafält för att lagra olika typer av data för ett inlägg, kommer du så småningom att behöva ha flera instanser av samma fält. Med lite javascript kan du enkelt kopiera ett fält så många gånger du behöver det, och även sortera dem med dra och släpp. Det finns många sätt att använda denna funktion, men för vårt exempel kommer vi bara att använda en grundläggande textinmatning.
jQuery ('. repeatable-add'). Klicka på (funktion () field = jQuery (this) .closest ('td'). hitta ('. custom_repeatable li: last'). klon (sant); fieldLocation = jQuery det här) .closest ('td'). hitta ('. custom_repeatable li: last'); jQuery ('input' .replace (/ (\ d +) /, funktion (fullMatch, n) returnummer (n) + 1;);)) field.insertAfter (fieldLocation, jQuery (this) .closest ('td') ;); jQuery ('. Repeatable-Remove'). Klicka på (funktion () jQuery (detta) .parent (). remove (); return false;); jQuery ('. custom_repeatable'). opacitet: 0,6, återgå: true, cursor: 'move', hantera: '.sort');
Du kan lägga till detta javascript till de anpassade js du redan har skapat i det sista steget.
Den första funktionen letar efter tilläggsknappen och lägger till en ny tom fältrad till slutet av listan med fält. Detta skapas generellt så att du kan ha så många av dessa repeterbara fält som du behöver.
Nästa funktion ger varje borttagningsknapp möjlighet att ta bort den raden när den klickas.
Slutligen ställer vi in listorna som ska sorteras och definierar ett handtag så att du kan dra och släppa raderna. Det finns inget behov av att förutse den jQuery UI-sorterbara interaktionen eftersom den redan används på redigeringssidan.
array ('label' => 'Repeatable', 'desc' => 'En beskrivning för fältet.', 'id' => $ prefix.'repeatable ',' type '=>' repeatable ')
Det finns inget speciellt för detta fält i arrayen för vårt exempel. Du kan dock bli ganska galen här och lägga till alternativ för vilken typ av fält som används i listan som kan repeteras.
// Repeatable case 'repeatable': echo '+
Detta fält kräver en slinga om det finns ett metavärde sparat och ingen slinga om det inte finns.
.$ i
heltal för att se till att ett nytt nummer läggs till i namnet array.Om du har följt med alla tre delarna av denna serie hittills, måste din sista låda se ut som den som visas här:
Vi har verkligen bara repat ytan på vad som kan göras med den här metoden att bygga en återanvändbar anpassad meta-boxmall. Ju mer du lägger till i din mall, desto lättare är det att släppa det in i vilket projekt du arbetar med för att göra den tid du spenderar kodning snabbare och för att effektivisera processen med ren, konsekvent kod.