Plugin Templating inom WordPress

När det gäller att skapa en anpassad posttyp i ett WordPress-plugin, finns det alltid samma problem: du måste skapa en anpassad enkel- [cpt_slug] .php filen i din temamapp om du inte vill använda standardvärdet single.php filen från ditt tema.

I det här inlägget vill jag täcka två aspekter av att använda anpassade mallar. Det första steget är att visa att vi kan använda en anpassad fil som finns direkt i pluginet i stället för att läsa in standard single.php, och den andra är hur man skapar en egen anpassad fil i tematmappen.

Många plugins som Easy Digital Downloads eller Shopp, använd den här metoden: pluginet kontrollerar om du definierar en anpassad mall i temakartan. Om så är fallet laddas filen in, annars laddas default plugin template-filen. I båda fallen är temat som standard single.php filen är inte laddad.


Definiera plugin och dess struktur

Det allra första steget är att skapa ett plugin, låt oss kalla det "Mallväljare". Skapa en "mall-chooser"mapp under / Wp-content / plugins /, med följande struktur:

Pluginstrukturen

Öppna sedan huvudfilen mall-choose.php och placera följande plugin header code:

/ * Plugin-namn: CPT-mall Val av plugin-URL: http://wp.tutsplus.com/ Beskrivning: Laddar en anpassad mallfil istället för standard single.php Version: 0.1 Författare: Remi Corson Författare URI: http: // wp .tutsplus.com / * /

Definiera pluginkonstanterna

Senare i pluginet måste vi enkelt hämta pluginadressen och dess sökväg, det är därför vi behöver definiera några konstanter:

 / * | ----------------------------------------------- --------------------------- | KONSTANTER | ------------------------------------------------ -------------------------- * / om (! definierat ('RC_TC_BASE_FILE')) definiera ('RC_TC_BASE_FILE', __FILE__); om (! definierat ('RC_TC_BASE_DIR')) definiera ('RC_TC_BASE_DIR', dirname (RC_TC_BASE_FILE)); om (! definierat ('RC_TC_PLUGIN_URL')) definiera ('RC_TC_PLUGIN_URL', plugin_dir_url (__FILE__));

Registrera en anpassad posttyp

För att gå vidare måste vi skapa en ny anpassad posttyp, låt oss skapa en "Rekommendation"CPT, med några mycket grundläggande stöd och funktioner. Eftersom syftet med inlägget inte är att lära sig hur man skapar en anpassad posttyp, använder jag en ganska enkel kod uppdelad i 3 delar: de anpassade posttypeniketterna, stöden , och de anpassade posttypargumenten. Allt som inbäddar en enda funktion:

 / * | ----------------------------------------------- --------------------------- | DEFINERA TJÄNSTPUNKTEN | -------------------------------------------- ------------------------------ * / / ** * Inställningspresentation Anpassad posttyp * * @since 1.0 * / function rc_tc_setup_post_types () // Anpassade posttypetiketter $ 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 __ ('Lägg till nytt omdöme', 'rc_tc'), 'edit_item' => esc_html __ ('Redigera testimonial', 'rc_tc'), 'new_item '=> esc_html __ (' New Testimonial ',' rc_tc '),' view_item '=> esc_html __ (' Visa Testimonial ',' rc_tc '),' search_items '=> esc_html __ not_found '=> esc_html __ (' Inga testresultat hittades ',' rc_tc '),' not_found_in_trash '=> esc_html __ (' Ingen testamente i papperskorgen ',' rc_tc '),' parent_item_colon '=> "); // Stöder $ support = array ('title', 'editor'); // Anpassad posttyp Stöder $ args = array ('labels' => $ etiketter, 'public' => true, 'public_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, 'support' => $ support, 'menu_icon' => RC_TC_PLUGIN_URL. '/includes/images/testimonials_icon.png', // du kan ställa in din egen ikon här); // Slutligen registrera "testimonial" anpassade posttyp register_post_type ("testimonial", $ args);  add_action ('init', 'rc_tc_setup_post_types');

Använd inte standardvärdet single.php Fil

Nu när vår anpassade posttyp är registrerad måste vi skapa en funktion som kommer att berätta för WordPress inte att använda standardvärdet single.php från temat.

Eftersom yes som standard när du visar en anpassad posttyp på frontänden kommer WordPress att kontrollera om en fil heter enkel testimonial.php existerar och laddar den. Om inte, kommer det att leta efter single.php. Men vi vill inte använda någon av dem.

Vi vill att WordPress ska ladda en anpassad fil från plugin. För att göra det måste vi koppla en ny funktion till "template_include"filter. I denna funktion är syftet att kontrollera postens typ och agera som följd:

 / * | ----------------------------------------------- --------------------------- | FILTER | ------------------------------------------------ -------------------------- * / add_filter ('template_include', 'rc_tc_template_chooser'); / * | ----------------------------------------------- --------------------------- | PLUGIN FUNKTIONER | ----------------------------------------------- --------------------------- * / / ** * Returnerar mallfilen * * @since 1.0 * / function rc_tc_template_chooser ($ mall)  // Post ID $ post_id = get_the_ID (); // För alla andra CPT om (get_post_type ($ post_id)! = 'Testimonial') return $ template;  // Annan använda anpassad mall om (is_single ()) returnera rc_tc_get_template_hierarchy ('single'); 

Ladda rätt mall

Som du kan se, på rad 33 ringer vi en ny funktion rc_tc_get_template_hierarchy (). Det här är den funktion som kommer att kontrollera om WordPress måste ladda den anpassade filen från plugin eller mallen från temapappen.

Observera att när jag pratar om "mallen från temamappen", pratar jag om en anpassad fil i stället för single.php.

Låt oss säga att du inte vill ladda mallen som ingår i plugin men skapa din egen anpassade mall. Allt du behöver göra är att skapa en ny mapp i temapappen, namnge den "plugin_template"och i den här mappen skapa en single.php fil. Det här är din nya standard single.php laddad endast för testimonials som visas på fronten.

Är du fortfarande med mig? Okej, så låt oss skapa funktionen:

 / ** * Hämta den anpassade mallen om den är inställd * * @since 1.0 * / function rc_tc_get_template_hierarchy ($ mall) // Hämta mallen slug $ template_slug = rtrim ($ mall, '.php'); $ template = $ template_slug. '.Php'; // Kontrollera om det finns en anpassad mall i temamappen, om inte, ladda pluginmallfilen om ($ theme_file = locate_template (array ('plugin_template /'. $ Mall))) $ file = $ theme_file;  annars $ file = RC_TC_BASE_DIR. '/ inkluderar / mallar /'. $ Mall;  returnera apply_filters ('rc_repl_template_'. $ mall, $ fil);  / * | ---------------------------------------------- ---------------------------- | FILTER | ------------------------------------------------ -------------------------- * / add_filter ('template_include', 'rc_tc_template_chooser');

Standardinställningen för plugin

Skapa nu en ny testimonial i administrationen. Öppna sedan includes / mallar / single.php och sedan kopiera och klistra in den här enkla koden:

  Vi är i plugin anpassad fil 

Om du visualiserar testimonialen på frontenden bör du se "vi är i plugin anpassad fil". Det var vad vi ville ha. Men om plugin-mallfilen inte passar dina behov eller om du helt enkelt vill skapa en mer personlig design, kan du skapa en fil i temakorgen.


Teman Standardmall

För att skapa en anpassad mall som inte använder standarden från plugin kan du skapa en ny mapp som heter "plugin_templates"i din temmapp. Skapa en ny fil som heter single.php och placera den här koden:

  Vi är i temat anpassad fil 

Slutsats

Så vad gjorde vi exakt? Tja, vi skapade ett plugin som registrerar en anpassad posttyp "Rekommendation". Vi uppnådde funktionalitet för att ladda en anpassad fil lagrad i pluginmappen istället för standard single.php eller enkel testimonial.php filer från temapappen. Vi lyckades också ladda en anpassad fil istället från temapappen som ligger under "plugin_templates".

Varför är det här trevligt? För när du skapar ett eget plugin kan du ange en standardmall för att visa den anpassade posttypen så att du får valet för slutanvändaren om du vill använda sin egen mall eller inte.