Plugin Templating innen WordPress

Når det gjelder å lage en tilpasset posttype i et WordPress-plugin, er det alltid det samme problemet: du må opprette en egendefinert enkelt- [cpt_slug] php filen i temamappen din hvis du ikke vil bruke standardinnstillingen single.php fil fra temaet ditt.

I dette innlegget vil jeg gjerne dekke to aspekter ved bruk av egendefinerte maler. Det første trinnet er å vise at vi kan bruke en egendefinert fil som finnes direkte i plugin-modulen i stedet for å laste inn standard single.php, og den andre er hvordan du lager din egen tilpassede fil i temamappen din.

Mange plugins som Easy Digital Downloads eller Shopp, bruk denne metoden: pluginet kontrollerer om du definerer en egendefinert mal i temapappen din. Hvis det er tilfelle, blir filen lastet, ellers er standard plugin template filen lastet. I begge tilfeller er temaet standard single.php filen er ikke lastet inn.


Definer pluggen og dens struktur

Det aller første skrittet er å lage et plugin, la oss kalle det "Malvelger". Lage en "mal-velgeren"mappe under / Wp-content / plugins /, med følgende struktur:

Pluginstrukturen

Åpne deretter hovedfilen mal-choose.php og plasser følgende plugin header kode:

/ * Plugin Name: CPT template Velg Plugin URL: http://wp.tutsplus.com/ Beskrivelse: Laster en egendefinert malfil i stedet for standard single.php Versjon: 0.1 Forfatter: Remi Corson Forfatter URI: http: // wp .tutsplus.com / * /

Definer Plugin Constants

Senere i pluginet må vi enkelt hente pluginadressen og banen sin, derfor må vi definere noen få konstanter:

 / * | ----------------------------------------------- --------------------------- | KONSTANTER | ------------------------------------------------ -------------------------- * / hvis (! definert ('RC_TC_BASE_FILE')) definere ('RC_TC_BASE_FILE', __FILE__); hvis (! definert ('RC_TC_BASE_DIR')) definere ('RC_TC_BASE_DIR', dirname (RC_TC_BASE_FILE)); hvis (! definert ('RC_TC_PLUGIN_URL')) definere ('RC_TC_PLUGIN_URL', plugin_dir_url (__FILE__));

Registrer en egendefinert innleggstype

For å gå videre må vi sette opp en ny tilpasset posttype, la oss lage en "Testimonial"CPT, med noen svært grunnleggende støtte og funksjoner. Da formålet med innlegget ikke er å lære å lage en egendefinert innleggstype, bruker jeg en ganske enkel kode delt i 3 deler: de egendefinerte innleggstypene, støttene , og de egendefinerte innleggstype argumenter. Alt som er innebygd i en enkelt funksjon:

 / * | ----------------------------------------------- --------------------------- | DEFINER DEN TJENESTE POSTTYPE | -------------------------------------------- ------------------------------ * / / ** * Oppsettvurdering Tilpasset innleggstype * * @since 1.0 * / funksjon rc_tc_setup_post_types () // Egendefinerte posttypemerker $ labels = array ('name' => esc_html __ ('Testimonials', 'rc_tc'), 'singular_name' => esc_html __ ('Testimonial', 'rc_tc'), 'add_new' > esc_html __ ('Add New', 'rc_tc'), 'add_new_item' => esc_html __ ('Legg til ny testamente', 'rc_tc'), 'edit_item' => esc_html __ ('Rediger testimonial', 'rc_tc'), 'new_item '=> esc_html __ (' New Testimonial ',' rc_tc '),' view_item '=> esc_html __ (' Vis testimonial ',' rc_tc '),' search_items '=> esc_html __ not_found '=> esc_html __ (' Ingen testamente funnet ',' rc_tc '),' not_found_in_trash '=> esc_html __ (' Ingen testamente funnet i søppel ',' rc_tc '),' parent_item_colon '=> "); // Støtter $ støtter = array ('title', 'editor'); // Tilpasset posttype Støtter $ args = array ('labels' => $ etiketter, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'query_var' => true, 'can_export' => sant, 'rewrite' => array ('slug' => 'testimonials', 'with_front' => true ), 'capability_type' => 'post', 'hierarkisk' => false, 'menu_position' => 25, 'supports' => $ støtter, 'menu_icon' => RC_TC_PLUGIN_URL. '/includes/images/testimonials_icon.png', // du kan angi ditt eget ikon her); // Endelig registrer "testamentet" tilpasset posttype register_post_type ('testimonial', $ args);  add_action ('init', 'rc_tc_setup_post_types');

Ikke bruk standarden single.php Fil

Nå som vår egendefinerte innleggstype er registrert, må vi opprette en funksjon som forteller WordPress ikke å bruke standardinnstillingen single.php fra temaet.

Fordi Ja som standard når du viser en egendefinert innleggstype på frontend, vil WordPress sjekke om en fil kalles single-testimonial.php eksisterer og vil laste den. Hvis ikke, vil det se etter single.php. Men vi vil ikke bruke noen av dem.

Vi vil at WordPress skal laste inn en egendefinert fil fra plugin. For å gjøre det, må vi koble en ny funksjon til "template_include"filter. I denne funksjonen er målet å sjekke postens type og fungere som følger:

 / * | ----------------------------------------------- --------------------------- | FILTERS | ------------------------------------------------ -------------------------- * / add_filter ('template_include', 'rc_tc_template_chooser'); / * | ----------------------------------------------- --------------------------- | PLUGIN FUNKSJONER | ----------------------------------------------- --------------------------- * / / ** * Returnerer malfil * * @since 1.0 * / function rc_tc_template_chooser ($ template)  // Post ID $ post_id = get_the_ID (); // For alle andre CPT hvis (get_post_type ($ post_id)! = 'Testamente') return $ template;  // Else bruk egendefinert mal hvis (is_single ()) return rc_tc_get_template_hierarchy ('single'); 

Legg inn riktig mal

Som du ser, på linje 33 ringer vi en ny funksjon rc_tc_get_template_hierarchy (). Dette er funksjonen som vil sjekke om WordPress må laste den egendefinerte filen fra plugin eller malen fra temamappen.

Vær oppmerksom på at når jeg snakker om «mal fra temomappen», snakker jeg om en egendefinert fil lastet i stedet for single.php.

La oss si at du ikke vil laste inn malen inkludert i pluginet, men opprett din egen tilpassede mal, alt du trenger å gjøre er å lage en ny mappe i temapappen, nevner den "plugin_template"og i denne mappen opprett en single.php fil. Dette blir din nye standard single.php lastet bare for attester som vises på frontenden.

Er du fortsatt med meg? Ok, så la oss skape funksjonen:

 / ** * Få den egendefinerte mal hvis den er angitt * * @since 1.0 * / function rc_tc_get_template_hierarchy ($ template) // Få malens slug $ template_slug = rtrim ($ template, '.php'); $ template = $ template_slug. 'Php'; // Sjekk om det finnes en egendefinert mal i temapappen, hvis ikke, legg inn plugin template filen hvis ($ theme_file = locate_template (array ('plugin_template /'. $ Mal))) $ file = $ theme_file;  ellers $ file = RC_TC_BASE_DIR. '/ inkluderer / maler /'. $ Mal;  return apply_filters ('rc_repl_template_'. $ mal, $ fil);  / * | ---------------------------------------------- ---------------------------- | FILTERS | ------------------------------------------------ -------------------------- * / add_filter ('template_include', 'rc_tc_template_chooser');

Standardinnstillingene for plugin

Opprett nå en ny vurdering i administrasjonen. Så åpne includes / templates / single.php og så kopier og lim inn denne enkle koden:

  Vi er i plugin-tilpasset fil 

Hvis du visualiserer testamentet på frontenden, bør du se "vi er i plugin-tilpasset fil". Det var det vi ønsket. Men hvis plugin-malfilen ikke passer dine behov, eller hvis du bare vil lage en mer personlig design, kan du opprette en fil i temamappen din.


Tema-standardmalen

Hvis du vil opprette en egendefinert mal som ikke bruker standardinnstillingen fra plugin, kan du opprette en ny mappe som heter "plugin_templates"i temamappen din. Opprett en ny fil som heter single.php og plasser denne koden:

  Vi er i temaet tilpasset fil 

Konklusjon

Så hva gjorde vi akkurat? Vel, vi opprettet et plugin som registrerer en egendefinert innleggstype "Testimonial"Vi oppnådde funksjonalitet for å laste en tilpasset fil lagret i pluginmappen i stedet for standard single.php eller single-testimonial.php filer fra temamappen. Vi klarte også å laste en tilpasset fil i stedet fra temamappen som ligger under "plugin_templates".

Hvorfor er dette fint? Fordi når du lager ditt eget plugin, kan du angi en standardmal for å vise den egendefinerte innleggstypen, slik at du får valget til den endelige brukeren om du skal bruke sin egen mal eller ikke.