WordPress.org

Support

Support » How-To and Troubleshooting » conditional tags and using custom fields

conditional tags and using custom fields

  • 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…)

Viewing 3 replies - 1 through 3 (of 3 total)
  • 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.

    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.

    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

Viewing 3 replies - 1 through 3 (of 3 total)
  • The topic ‘conditional tags and using custom fields’ is closed to new replies.