[wp-trac] [WordPress Trac] #19063: Custom post_types and get_template_part

WordPress Trac wp-trac at lists.automattic.com
Thu Oct 27 16:17:59 UTC 2011

#19063: Custom post_types and get_template_part
 Reporter:  impleri      |       Owner:
     Type:  enhancement  |      Status:  new
 Priority:  normal       |   Milestone:  Awaiting Review
Component:  Template     |     Version:
 Severity:  minor        |  Resolution:
 Keywords:  has-patch    |

Comment (by impleri):

 If `post_type` is false, the `if(!in_array($post_type, $default_types))`
 will return false, thereby ignoring the additional template possibilities
 (after all, the interest is for custom post_types -- which will have
 `post_type` set).

 For the array, this should be changed to retrieve the post_type for the
 actual post (easy enough) which cannot be an array (at least according to
 the DB design). Would using `get_post_type()` fix this? (posting new patch
 with this)

 I disagree on using something like `locate_template()` for a few reasons.
 First, it comes too late in the template loading process. Adjusting
 `get_template_part()` as I propose is essentially the same as adjusting
 `locate_template()` except in one crucial point, which is my second
 reason: it would add additional filtering and process time because
 `locate_template()` is called for every template piece. Using something
 like `get_template_part()` follows what I think are the goals in the
 template system: modularity. Using `locate_template()`, while it does this
 as well, it adds process time without benefit. Thirdly,
 `get_template_part()` appears to be the logical choice because that is
 where possible template names are decided. Pushing this to
 `locate_template()` would be obfuscating its function. The options as I
 see them are to use `get_template_part()` or to create a new function
 similar to `get_header()` (e.g. `get_main_content()` or something) though
 even then `get_template_part()` would need to be modified to allow for a
 base plugin-defined template (either by postponing `load_template()` until
 after a filter check -- like I have done -- or returning a template path
 to a `get_main_content()` function which then does `load_template()` after
 a filter check).

 Since this is meant to enable custom post_types to display properly, a URL
 like `http://mysite.com/records/my-own-musical-beast/` which is used by a
 music record/album custom post_type might not display anything because the
 content is a listing of songs generated from the DB. Currently, I would
 need to filter `the_content` in order to display this, filter on
 `template_include` or `single_template` to redirect to a template which
 will show the correct data. In the first case, I am hardcoding the
 template from my plugin (not good). In the latter two cases, I am
 overriding the actual template (e.g. what if a template puts the sidebar
 on the left but does not do so in the template's header.php like
 TwentyEleven does in footer.php?). By using `get_template_part()` or
 something similar, it is easier for my record file to show in a randomly-
 given theme without forcing a particular template layout. For example, I'm
 updating the extinct Now Reading plugins to use custom post_types. A book
 (e.g. http://beta.impleri.net/library/product/the-girl-with-the-dragon-
 tattoo/ ) needs to be able to have multiple authors, an image, a link to
 Amazon page, etc. These do not show up on the template pages because,
 obviously, they are custom data which need to be displayed. What I'm doing
 right now is using the `single_template` filter, checking if the custom
 `single-ml_product.php` file was found by `locate_template()` and, if not,
 redirecting to the `single-ml_product.php` template file in my plugin
 directory. This is not a good solution because I've had to copy the entire
 page layout from TwentyEleven (I'll attach this file as well) which may
 not work with other templates. I could have filtered `the_content` but
 then I am requiring a hardcoded style across which makes it more difficult
 to users to have template-specific designs. If I could have filtered
 through `get_template_part()`, users would only have to worry about minor
 tweaks for a template which they could put in their template folder
 without needing to recreate a loop page -- much like TwentyEleven has made
 it possible with its `content-single.php` file. Thus far, that seems to be
 simplest solution which is most extensible and most logical from what I
 can tell.

Ticket URL: <http://core.trac.wordpress.org/ticket/19063#comment:7>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software

More information about the wp-trac mailing list