Support » Themes and Templates » Dynamic ID for <body> and subpages

  • Hi,
    i want setup in my header.php a different values for the tag <body>.
    Example:
    <body id=”services”>

    I’ve already tested this with get_query_var(‘name’) and it works fine.
    But my problem is when a page (in my case services) has a child page: in this case i don’t want display subpage name (eg hosting) but the parent page name (services).

    Any ideas?

Viewing 11 replies - 1 through 11 (of 11 total)
  • You may want to check out this thread. I use this function to get the top parent for a page. You could then convert the page ID into a page name to use in your body tag.

    http://wordpress.org/support/topic/37387

    LiZharD, let me know if you need any help converting the script jpepper points to. It’s fairly easy to modify it to what you want to do.

    Thread Starter lizhard

    (@lizhard)

    Thanks Kafkaesqui, please post your implementation 😉
    Many thanks to all

    Here’s a couple methods, depending on what’s needed:

    1. To grab the ‘post_name’ of the direct parent to the Page:

    <?php
    $page = $wp_query->post;
    $parent_name = $wpdb->get_var("SELECT post_name FROM $wpdb->posts WHERE ID = '$page->post_parent;'");
    ?>

    And to display the parent Page’s name:

    <body id="<?php echo $parent_name; ?>">

    2. To collect it for the *top* parent, that is the one at the top of a Page parent<>child heirarchy, we can modify the code from jpepper’s link:

    <?php
    $current_page = $post->ID;
    $parent = 1;

    while($parent) {
    $page_query = $wpdb->get_row("SELECT post_name, post_parent FROM $wpdb->posts WHERE ID = '$current_page'");
    $parent = $current_page = $page_query->post_parent;
    if(!$parent)
    $parent_name = $page_query->post_name;
    }
    ?>

    Then use the same method as above to display the name.

    Thread Starter lizhard

    (@lizhard)

    Many many thanks Kafkaesqui, works with charme! You’re a star!!!

    Hi 🙂

    So I am trying to implement this solution as well. However, I must be implementing something wrong because when I do I get a blank class tag in the body. Currently this is my code
    <?php echo (is_page()) ? get_query_var('name') : ((is_home()) ? "home" : ((is_search()) ? "other" : ((is_single()) ? "other" : "home"))); ?> this method is for pages, and not their children.

    I assume the method described in this post is supposed to be implemented as follows inside the header template
    <?php
    $current_page = $post->ID;
    $parent = 1;

    while($parent) {
    $page_query = $wpdb->get_row("SELECT post_name, post_parent FROM $wpdb->posts WHERE ID = '$current_page'");
    $parent = $current_page = $page_query->post_parent;
    if(!$parent)
    $parent_name = $page_query->post_name;
    }
    ?>

    <body class="<?php echo $parent_name; ?>">

    When I do it like this I don’t get anything on any of my pages, even on the page with a parent I still get a blank body tag looking like this <body class="">I am sure I am just implementing something wrong. I have been trying to get into PHP more and more, but at times I just don’t know the order of how things work. Thanks for any help I get! Also, my page is located at http://fvd.fluidvision.net

    Anyone have any idea on this? I have been searching and trying things for the past day, any help is much appreciated thanks.

    Okay, for anyone else in the future that needs a better explanation of how to to this, here you go. In your header template file, place this code:

    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <?php
    $current_page = $post->ID;
    $parent = 1;
    while($parent) {
    $page_query = $wpdb->get_row("SELECT post_name, post_parent FROM $wpdb->posts WHERE ID = '$current_page'");
    $parent = $current_page = $page_query->post_parent;
    if(!$parent)
    $parent_name = $page_query->post_name;
    }
    ?>

    <?php endwhile; else: ?>

    <?php endif; ?>

    <body class="<?php echo (is_page()) ? "$parent_name" : ((is_home()) ? "home" : ((is_search()) ? "other" : ((is_single()) ? "other" : "home"))); ?>">

    My problem was not putting it in the loop. And once I did, making it show up the correct class for my search and single pages. Cheers.

    OK, question: How do I get the value of the page title (which may be more than one word, eg. home, who we are, etc) to use as the title displayed (in the browser itself , between the title tags) and yet get a syntactically correct reference (no spaces or odd characters because CSS won’t allow it) to the page post SLUG (eg: home, who, etc) to create a body tag id?

    I see that I can simply put <?php the_title(); ?> between the <title></title> tags and that works, but I also need to reference something in the body tag (prefer the Page post slug, because I can control that).

    Help?

    Thanks so much Kafkaesqui and everyone. This works great.

    If you’re up for some fun with the functions.php file and creating some dynamic functions for producing “semantic” classes, I’ve posted an article of this very topic:

    Dynamic Semantic Classes

    This basically explains a “simple” way to give the body tag dynamic & semantic classes, e.g., on the home page, body class="home " and on a single, body class="single " and then on a category archive page, body class="archive category "

    Or something like that.

Viewing 11 replies - 1 through 11 (of 11 total)
  • The topic ‘Dynamic ID for <body> and subpages’ is closed to new replies.