WordPress.org

Ready to get started?Download WordPress

Forums

Dynamic ID for <body> and subpages (12 posts)

  1. LiZharD
    Member
    Posted 9 years ago #

    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?

  2. jpepper
    Member
    Posted 9 years ago #

    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

  3. Kafkaesqui

    Posted 9 years ago #

    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.

  4. LiZharD
    Member
    Posted 9 years ago #

    Thanks Kafkaesqui, please post your implementation ;)
    Many thanks to all

  5. Kafkaesqui

    Posted 9 years ago #

    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.

  6. LiZharD
    Member
    Posted 9 years ago #

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

  7. mrsugar
    Member
    Posted 8 years ago #

    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

  8. mrsugar
    Member
    Posted 8 years ago #

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

  9. mrsugar
    Member
    Posted 8 years ago #

    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.

  10. syncbox
    Member
    Posted 8 years ago #

    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?

  11. Ryan Fitzer
    Member
    Posted 8 years ago #

    Thanks so much Kafkaesqui and everyone. This works great.

  12. scottwallick
    Member
    Posted 7 years ago #

    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.

Topic Closed

This topic has been closed to new replies.

About this Topic

Tags

No tags yet.