[wp-hackers] Replace default doctype on one page only through plugin

Gaarai gaarai at gaarai.com
Mon Jan 19 03:07:08 GMT 2009

Hi Lynne.

Why not create a filter and use it in your header.php file?

For example:

    <?php $page_doctype = '*<!DOCTYPE html PUBLIC "-//W3C...>*'; ?>
    <?php $page_doctype = apply_filters( 'alter_page_doctype',
    $page_doctype ); ?>
    <?php echo $page_doctype; ?>
    <html ...>

The bold portion needs to be modified to be whatever your default 
doctype is.

Then all you have to do is latch into this filter via your plugin and 
put the necessary code in the filtering function that will determine 
when the conditions are right to change the doctype. Actually, you can 
do the conditional before you add the filter so that the function 
doesn't even run if it doesn't need to.

For example:

        if ( preg_match( '|^*/special/*|', $_SERVER['REQUEST_URI'] ) )
           add_filter( 'alter_page_doctype', use_custom_doctype );
        function use_custom_doctype( $doctype ) {
           return '*<!DOCTYPE...>*';

This code basically looks for any URL of the format 
http://domain.com/special/ or http://domain.com/special/something-else/. 
In other words, it matches anything that has /special/ directly after 
the domain. It then adds the filter to output a custom doctype.

An alternate example that only matches a specific request is as follows:

        if ( '*/special/*' === $_SERVER['REQUEST_URI'] )
           add_filter( 'alter_page_doctype', use_custom_doctype );
        function use_custom_doctype( $doctype ) {
           return '*<!DOCTYPE...>*';

This only works for a request of the form http://domain.com/special/ and 
nothing else.

In each of the last two samples of code, there are two portions in bold.

The first bold portion is what you should change to match the page/post 
link that you are targeting. Note the beginning and ending forward 
slash. The format is extremely important. if you mess it up, the match 
won't work.

The second bold portion is where you put your custom doctype.

Doing the customization this way, you can modify your doctype anyway you 
want and won't be boxed in a corner later on in case you need to modify 
how this doctype change functions. Also, it fits in exactly with the 
coding style of WordPress.

I tested this out by adding the first piece of code to my test site in 
the header.php file in place of the standard doctype definition. I then 
loaded the second bit of code in my functions.php file. I tested it out 
on the page I put in the code, and it worked like a charm.

Good luck.

Chris Jean

Lynne Pope wrote:
> Hi all,
> I am working on a site that is using XHTML 1.0 Strict but want to serve
> XHTML 1.0 Transitional on one page only. The page uses a plugin so the
> change to the doctype could go into the plugin.
> I can do a query in header.php but want to avoid unnecessary queries (why
> add an additional query to 300+ pages when only one is affected?) but cannot
> get an override working for the plugin.
> Any ideas?
> Lynne
> _______________________________________________
> wp-hackers mailing list
> wp-hackers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-hackers

More information about the wp-hackers mailing list