Hvorfor kan jeg ikke gjøre dette?

clinton4

Medlem
Hei,

Jeg har denne funksjonen i en plugin på en WP side. Dette er en plugin som viser x antall poster fra valgte kategorier.

PHP:
    function widget($args, $instance) {
        $before_title = $before_widget = $after_widget = $after_title = '';
        extract($args, EXTR_IF_EXISTS);
        // Begin widget display
        echo $before_widget;
        echo $before_title.$instance['title'].$after_title;
        echo '<ul class="tm-latest-updates">';

        // Make call to get most recent posts from the specified post type
        $params = array(
            'numberposts' => $instance['numberposts'],
            'orderby' => 'date',
            'order' => 'DESC',
            'post_type' => $instance['post_type'],
        );
        // Check if we are filtering based on taxonomy tags/categories
        if(($instance['show_advanced'] == 'yes')
            && ($instance['taxonomies'] != '--')
            && is_array($instance['tag_list'])
            && (count($instance['tag_list']) > 0)
        ) {
            // We are filtering, add the filter to the query
            $params['tax_query'] = array(
                array(
                    'taxonomy' => $instance['taxonomies'],
                    'field' => 'id',
                    'terms' => $instance['tag_list'],
                    'operator' => strtoupper(str_replace('_', ' ', $instance['tax_in']))
                )
            );
            if(is_numeric($instance['tag_list'][0])) $params['tax_query'][0]['field'] = 'id';
            else $params['tax_query'][0]['field'] = 'slug';
        }
        // Get the posts!
        $posts = get_posts($params);
        // Print 'em out!
        if($posts)
            foreach($posts as $post)
	

                echo '<li><a href="'.get_permalink($post->ID).'" title="'.$post->post_title.'">'.$post->post_title.'</a></li>';
        // Always remember your closing tags!
        echo '</ul>'.$after_widget;
    }

Hvorfor kan jeg ikke endre denne seksjonen:

PHP:
        if($posts)
            foreach($posts as $post)
	

                echo '<li><a href="'.get_permalink($post->ID).'" title="'.$post->post_title.'">'.$post->post_title.'</a></li>';
        // Always remember your closing tags!
        echo '</ul>'.$after_widget;

Til:

PHP:
        if($posts)
            foreach($posts as $post)
				
				// Lagt til av meg:
				$new_title = $post->post_title;
				if(strlen($new_title) > 40){ $new_title = substr($new_title, 0, 40).'...'; }

                echo '<li><a href="'.get_permalink($post->ID).'" title="'.$post->post_title.'">'.$new_title.'</a></li>';
        // Always remember your closing tags!
        echo '</ul>'.$after_widget;

Når jeg gjør denne endringen, vises kun en post i listen. Som normalt skal vise 10.

Any ideas?
 

typisk

Utvikler
PHP:
if($posts) 
            foreach($posts as $post) {
                 
                // Lagt til av meg: 
                $new_title = $post->post_title; 
                if(strlen($new_title) > 40){ $new_title = substr($new_title, 0, 40).'...'; } 

                echo '<li><a href="'.get_permalink($post->ID).'" title="'.$post->post_title.'">'.$new_title.'</a></li>'; 
}
        // Always remember your closing tags! 
        echo '</ul>'.$after_widget;
 

clinton4

Medlem
Trodde jeg allerede hadde prøvd det, og da virket det ikke. Men det fungerer nå :)

Hvorfor unnlater noen å bruke {} egentlig?
 

drlinux

Konsulent i PHP og Linux
Hvorfor unnlater noen å bruke {} egentlig?

For å spare en linje eller to. Det har vel neppe noen stor betydning, men

PHP:
<?php
if ($a == 1)
{
   // Alt er bra
    echo 'Hello, world!';
}
else 
{
   // Alt suger
   echo 'Goodbye cruel world!';
}
?>

kan kortes ned til;


PHP:
<?php
if ($a == 1) echo 'Hello, world!';
else echo 'Goodbye cruel world!';
?>

Jeg pleide å være fanatisk minimalist tidligere, men nå bruker jeg klammer og kommentarer overalt. Det minimerer feil, og du vil takke deg selv når du må vedlikeholde kode som du skrev for ett år siden.
 

adeneo

Medlem
Problemet ligger i at i løselige språk, slik som PHP, så kan man unnlate å bruke klammer, men det er normalt ikke en god ide med mindre det er noe svært enkelt.

Hvis man unnlater å bruke klammer i en contructor (do, while, for osv.) så er det kun den neste linjen som blir utført innenfor constructor'en, og med linje så menes frem til neste lukking, som da normalt er en semikolon.
Alt etter første semikolon er ikke med i constructor'en, så i tilfellet ovenfor så er det kun linjen:

PHP:
$new_title = $post->post_title;

som er med i foreach loopen, derfor er det en god ide å unnlate klammer kun når man har god oversikt, og jeg bruker det kun hvis jeg kan stille det på en linje, som f.eks:

PHP:
if ($jeg==$meg) echo "Det er meg jo";

For enkle if/else bruker jeg nesten alltid det som kalles for en "ternary operator"

PHP:
$erDetMeg = $jeg==$meg ? 'Det er meg jo' : 'Det var visst ikke meg';
echo $erDetMeg;

Jeg liker å bruke litt variabler, det blir så mye triveligere da, men det går vel også å gjøre:

PHP:
$jeg==$meg ? echo 'Det er meg jo' : echo 'Det var visst ikke meg';
 
Sist redigert:
Topp