[wp-hackers] Showing custom page types

Mike Schinkel mikeschinkel at newclarity.net
Thu Jan 29 21:00:36 GMT 2009


I have exactly the same needs.  URL management and related content is a real pain in WP (unlike Drupal which is easy and from whence I came.) I've been meaning to write about it but am glad someone else better known on the list has decided to tackle the issue first.

I've identified that /wp-content/template-loader.php doesn't provide any reasonable way to let someone call custom code off a custom URL.

I'd love to work with you on this. It's probably what I see as WordPress' biggest limitation for my own needs followed closely by lack of custom post types.
-Mike Schinkel

P.S. I've also come to the conclusion that requiring the use of regex for URL mapping greatly reduces the number of people who can approach using WordPress as a CMS.  I'd really like to see URL Templates used as for the 80% cases and then regex could be used for the more advanced cases.  For example, if I wanted to create a list of companies, I'd like to be able to specify the URLs like this:


I've done some work in that area at http://code.google.com/p/simpleurlmapper/

----- Original Message -----
From: "Chris Jean" <gaarai at gaarai.com>
To: wp-hackers at lists.automattic.com
Sent: Thursday, January 29, 2009 1:48:08 PM GMT -05:00 US/Canada Eastern
Subject: [wp-hackers] Showing custom page types

I'm working on a new project that uses WordPress as a framework rather 
than as just a blogging platform. I want to be able to have custom URL 
structures, such as /tool/option, that will end up passing variables to 
a set of code to render the page contents rather than one of the theme 
template files rendering the content.

I have it working, but I feel like there is a better way to do this. I 
want to run what I've done by this list to see if anyone has a better or 
more standard way of doing this.

    /* Part of plugin code pertaining to this discussion */

    add_action( 'init', 'add_rewrite_rules' );
    add_action( 'template_redirect', 'load_custom_page_setup' );

    function load_custom_page_setup() {
        $tool = get_query_var( 'tool' );
        if ( ! empty( $tool ) ) {
            add_action( 'render_custom', 'run_tool' );

    function add_rewrite_rules() {
        // This should only be run when the plugin is first initialized
    or when the
        // rules are flushed by some other process.
        global $wp, $wp_rewrite;
        $wp_rewrite->add_rule( 'lookup/?$', 'index.php?tool=lookup',
    'top' );
        $wp_rewrite->add_rule( 'lookup/([^/]+)/?$',
    'index.php?tool=lookup&option1=$matches[1]', 'top' );
        $wp_rewrite->add_rule( 'lookup/([^/]+)/([^/]+)/?$',
    'top' );
        // Quick hack just to make this work while I make changes
        $wp->add_query_var( 'tool' );
        $wp->add_query_var( 'option1' );
        $wp->add_query_var( 'option2' );

    function run_tool() {
        $tool = get_query_var( 'tool' );
        if ( ! empty( $tool ) ) {
            switch( $tool ) {
                case 'lookup':

    if ( ! function_exists( 'is_custom' ) ) {
        function is_custom() {
            $lookup = get_query_var( 'lookup' );
            if ( ! empty( $lookup ) )
                return true;
            return false;

    /* End plugin code */

    /* Modification added home.php or index.php file depending on theme
    setup */

    <?php if ( ! function_exists( 'is_custom' ) || ! is_custom() ) : ?>
        /* Standard theme code/markup here */
    <?php else : ?>
        <?php do_action( 'render_custom' ); ?>
    <?php endif; ?>

    /* End theme modification */

Basically, I've found the only way to insert this custom output into a 
theme is by modifying the theme itself since there isn't a specification 
for custom output that fills in a blank template location.

I could create a page template, but that would either require passing 
the variables in a query string or creating a page for each possible 
combination of URL "paths" and manually parsing the URL in the code to 
derive the variables.

Ideally, I'd like there to be a way to keep all this logic and code 
completely within the plugin and not require the theme to be modified. 
As far as I can tell, the only way to make this standard is to add a new 
conditional tag, such as is_custom, and add to the template spec a new 
template file, such as custom.php, that is nothing more than a theme 
file that calls an action in place of content.

Just so you know of a couple of different ways that I tried out, I've 
done the following:

    * Used the template_redirect hook to check for my custom vars. If
      they are set, set the $wp_query->is_robots variable to true, clear
      out the do_robots action hook, and add my own function to the
      do_robots action. This actually works really well with one big
      caveat: there isn't a template. So, this method could work well if
      you don't require any of the theme template.
    * I started to journey down the road of trying to latch into the
      is_single process so that I could take advantage of the relatively
      simple setup that most single.php template files have. This would
      require me to setup my own title, content, etc variables when
      the_post is called. At first, I thought that this was a promising
      road, but it's really a minefield as it would require me to jump
      through hurdles of getting successful queries, faking and then
      replacing many internal variables, and that's just the tip of the

Please share any thoughts or ideas that you have. If there is a way to 
do this within the current WordPress structure, I'd love to know about it.

Chris Jean

wp-hackers mailing list
wp-hackers at lists.automattic.com

More information about the wp-hackers mailing list