WordPress.org

Ready to get started?Download WordPress

Forums

conditional tags and using custom fields (4 posts)

  1. llizard
    Member
    Posted 6 years ago #

    When there are custom fields filled in on my wordpress, I would like to use slightly different styles for some of the list items. I would also like to surround them with a border. And because not every post in uses the custom fields, I began asking this question at the end of the thread entitled display custom field only if value present? I hope it is permissible that I have started a new thread.

    I have been using Get Custom Field Values 2.1 but as I search for a solution to my problem, I see that this plugin does not work in wp2.2. In anticipation of eventual upgrade from wp2.0.11, I have tried to get a grasp on http://codex.wordpress.org/Using_Custom_Fields

    It is not exactly worded for the layperson...

    With the help of other tutorials found by googling, I have managed to get most of it to work. The coding seems a bit heavy to me but there it is... The following produces listed items as expected. However, they are NOT surrounded by <ul></ul> as they would be if I simply used <?php the_meta(); ?>.

    $pubs = get_post_meta($post->ID, 'Publication', $single = false);
     foreach( $pubs as $pub ) {
    echo '<li class="publication"><strong>'.$pub.'"</strong></li>';
    }
    
    $pubtitles = get_post_meta($post->ID, 'Publication Title', $single = false);
     foreach( $pubtitles as $pubtitle ) {
    echo '<li class="pubtitle"><strong>'.$pubtitle.'"</strong></li>';
    }
    
    $cauthors = get_post_meta($post->ID, 'Publication Author', $single = false);
     foreach( $cauthors as $cauthor ) {
    echo '<li>By '.$cauthor.'"</li>';
    }
    
    $pubURLs = get_post_meta($post->ID, 'Publication URL', $single = false);
     foreach( $pubURLs as $pubURL ) {
    echo '<li><small>(<a href="'.$pubURL.' " title="offsite link">learn more by following this link</a>)</small></li>';
    }

    After staring at http://codex.wordpress.org/conditional_tags, I tried the following:

    if (is_the_meta()) {
    echo '<ul class="post-meta">';
    
    $pubs = get_post_meta($post->ID, 'Publication', $single = false);
     foreach( $pubs as $pub ) {
    echo '<li class="publication"><strong>'.$pub.'"</strong></li>';
    }
    
    $pubtitles = get_post_meta($post->ID, 'Publication Title', $single = false);
     foreach( $pubtitles as $pubtitle ) {
    echo '<li class="pubtitle"><strong>'.$pubtitle.'"</strong></li>';
    }
    
    $cauthors = get_post_meta($post->ID, 'Publication Author', $single = false);
     foreach( $cauthors as $cauthor ) {
    echo '<li>By '.$cauthor.'"</li>';
    }
    
    $pubURLs = get_post_meta($post->ID, 'Publication URL', $single = false);
     foreach( $pubURLs as $pubURL ) {
    echo '<li><small>(<a href="'.$pubURL.' " title="offsite link">learn more by following this link</a>)</small></li>';
    } 
    
    echo '</ul>';
    }
    else {
    echo '';
    }

    But of course, this is what appeared:

    Fatal error: Call to undefined function: is_the_meta()

    Where in wp can I find the conditional tag to use to only show the unordered list if the custom fields are filled in?

    Thank you.

    -ejm

    P.S. Here is a post that has the custom fields filled in: etherwork.net/blog/?p=447
    and here is one that does not:
    etherwork.net/blog/?p=446

    (Please refrain from making those URLs into live links - I'm really getting tired of spammers...)

  2. Morgaine
    Member
    Posted 6 years ago #

    I 'solved' it like this:

    In post-template.php, around line 216, you'll find:

    function the_meta() {
    	global $id;
    
    	if ( $keys = get_post_custom_keys() ) {
    		echo "<ul class='post-meta'>\n";
    		foreach ( $keys as $key ) {
    			$keyt = trim($key);
    			if ( '_' == $keyt{0} )
    				continue;
    			$values = array_map('trim', get_post_custom_values($key));
    			$value = implode($values,', ');
    			echo "<li><span class='post-meta-key'>$key:</span> $value</li>\n";
    		}
    		echo "</ul>\n";
    	}
    }

    Now change that to:

    function the_meta() {
    	global $id;
    
    	if ( $keys = get_post_custom_keys() ) {
    		echo "<ul class='post-meta'>\n";
    		foreach ( $keys as $key ) {
    			$keyt = trim($key);
    			if ( '_' == $keyt{0} )
    				continue;
    			$values = array_map('trim', get_post_custom_values($key));
    			$value = implode($values,', ');
    			echo "<li><span class='post-meta-key'>$key:</span> $value</li>\n";
    		}
    		echo "<li>\n";
    		echo "</li>\n";
    		echo "</ul>\n";
    	}
    }

    and it spits out an empty list item if you don't use custom fields in that entry, which apparently doesn't break validation.

  3. Morgaine
    Member
    Posted 6 years ago #

    An alternative, probably better, is replacing the original function with:

    function the_meta() {
    	global $id;
    
    	if ( $keys = get_post_custom_keys() ) {
    		foreach ( $keys as $key ) {
    			$keyt = trim($key);
    			if ( '_' == $keyt{0} )
    				continue;
    			echo "<ul class='post-meta'>\n";
    			$values = array_map('trim', get_post_custom_values($key));
    			$value = implode($values,', ');
    			echo "<li><span class='post-meta-key'>$key:</span> $value</li>\n";
    			echo "</ul>\n";
    		}
    	}
    }

    The only 'disadvantage' is that it will generate an unordered list for each custom field, populated with exactly one list item.

  4. llizard
    Member
    Posted 6 years ago #

    Thank you for your reply, Morgaine. The problem with spitting out an empty list item is that I have put a border around the unordered list. So even if the list item is empty, the border appears. This is what I have in my stylesheet:

    ul.post-meta {border-top:1px dotted #ddd; border-left:3px solid #000;}

    What would be ideal would be for the unordered list to appear ONLY if the custom fields are filled in.

    Alternatively, might there be a way of switching the class name of the unordered list from "post-meta" to "no-display" so I could remove the border for that class? (virtually hiding the empty list from view)

    I hope my question made sense.

    ...........
    It took me a while to locate "post-template.php". It turns out that it's because I don't have it. (I'm running WP 2.0.11) At last I found the function the_meta() coding in wp-includes/template-functions-post.php

Topic Closed

This topic has been closed to new replies.

About this Topic