WordPress.org

Forums

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

  1. LiZharD
    Member
    Posted 10 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 10 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 10 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 10 years ago #

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

  5. Kafkaesqui

    Posted 10 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 10 years ago #

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

  7. mrsugar
    Member
    Posted 9 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 9 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 9 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 9 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 9 years ago #

    Thanks so much Kafkaesqui and everyone. This works great.

  12. scottwallick
    Member
    Posted 8 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.