Kann benutzerdefinierten Widget Code in einem ECHO nicht schreiben

Ich erstelle ein WordPress-Benutzerdefiniertes Widget und ich habe das folgende erstellt, das gut funktioniert, wenn ich es in function.php hinzufüge.

  'show_popular_commented', 'description' => __('Show your popular commented posts.')); $this->WP_Widget('show_popular_commented', __('EXE_Widgets - Popular Commented Posts'), $widget_ops); } function widget($args, $instance){ extract($args); $title = $instance['title']; $postscount = $instance['posts']; //Show The Most Commented Posts global $postcount; $myposts = get_posts(array('orderby' => 'comment_count','numberposts' =>$postscount)); echo $before_widget . $before_title . $title . $after_title; //Widget Data echo '  .commented_post {display:block;margin:10px 0;border-bottom:1px solid #DEDEDE;} .commented_post h4{font-size:16px;clear:both;display:block;} .commented_post p{font-size:13px;text-align:justify;line-height:18px;margin:10px 0;}  '; foreach($myposts as $post){ setup_postdata($post); echo '
'; echo '

'; echo the_title(); echo'

'; echo the_excerpt(); echo '
'; } echo $after_widget; //Widget Data //Show The Most Commented Posts } function update($newInstance, $oldInstance){ $instance = $oldInstance; $instance['title'] = strip_tags($newInstance['title']); $instance['posts'] = $newInstance['posts']; return $instance; } function form($instance){ if(empty($instance['title'])){ $instance['title'] = '';}{ echo '

get_field_id('title').'" name="'.$this->get_field_name('title').'" type="text" value="'.$instance['title'].'" />

'; } if(empty($instance['posts'])){ $instance['posts'] = '';}{ echo '

get_field_id('posts').'" name="'.$this->get_field_name('posts').'" type="text" value="'.$instance['posts'].'" />

'; } echo ''; } } add_action('widgets_init', create_function('', 'return register_widget("show_popular_commented");')); ?>

Jetzt ist das Problem, dass ich nicht zu viele echo''; möchte echo''; wie ich im obigen Code verwendet habe …

  echo '
'; echo '

'; echo the_title(); echo'

'; echo the_excerpt(); echo '
';

Aber wenn ich ein echo''; und code das obige wie unten, dann funktioniert mein Widget nicht richtig. Es erhält alle Variablen Daten, aber nicht die HTML-Tags, die ich in echo'';

  echo '

'.the_title().'

'.the_excerpt().'
';

Kannst du mir antworten, warum es kein einzelnes echo''; akzeptiert echo''; ?

Solutions Collecting From Web of "Kann benutzerdefinierten Widget Code in einem ECHO nicht schreiben"

Technisch ist Ihr erstes Beispiel auch falsch, aber das Problem ist nicht offensichtlich. Sie verwenden Vorlagen-Tags, die ihren Inhalt selbst wiedergeben. Zum Beispiel können Sie einfach schreiben:

 the_permalink(); 

ohne echo , und der Permalink wird ausgegeben. Dies liegt daran, dass diese function ihren Wert zurückgibt. Um den Permalink innerhalb einer Echo- oder Variablenzuweisung ausgeben zu können, müssen Sie get_permalink :

 echo get_permalink() 

get_ alle WordPress-Template-Tags haben äquivalente get_ Versionen oder ein Argument, das echo und return wie the_title :

 the_title( '', '', false ); 

Hier schaltet der dritte Parameter echo (true) oder return (false) um.

Dies sollte nur eine Erweiterung der Antwort von @Milo sein

Es gibt ein paar Fehler in Ihrem Code

  • Sie sollten extract() . Es ist schwer zu debuggen und verursacht eine unerwartete Ausgabe. Alle Instanzen von extract() wurden aus dem core entfernt

  • PHP 5.2 ist tot und auch 5.3. create_function() ist vor 5.3. Dies ist ein großes Sicherheitsrisiko, da es eval() verwendet, das um jeden Preis vermieden werden sollte. Der richtige Weg ist nur die function()

  • Verwenden Sie WP_Query anstelle von get_posts() . WP_Query Ergebnisse werden im Cache WP_Query , wodurch sie schneller werden

  • classnnamen sollten mit camelcase beginnen

  • Verwenden Sie das öffnende und schließende PHP-Tag ordnungsgemäß, um die überwältigende Verwendung von echo zu vermeiden

Ich habe Ihr komplettes Widget neu geschrieben, um es an die aktuelle Widget-API anzupassen . Sie können nur die Optimierungen vornehmen, die Sie hinzufügen oder entfernen möchten

 /* ------------------------------------------------------------------------- * * Most Commented Post Widget /* ------------------------------------------------------------------------- */ class Show_Popular_Commented extends WP_Widget { public function __construct() { parent::__construct( 'show_popular_commented', __( 'Popular Commented Posts' ), array( 'description' => __( 'Show your popular commented posts.' ), ) ); $this->alt_option_name = 'show_popular_commented'; add_action( 'save_post', array($this, 'flush_widget_cache') ); add_action( 'deleted_post', array($this, 'flush_widget_cache') ); add_action( 'switch_theme', array($this, 'flush_widget_cache') ); } public function widget( $args, $instance ) { $cache = array(); if ( ! $this->is_preview() ) { $cache = wp_cache_get( 'widget_commented_posts', 'widget' ); } if ( ! is_array( $cache ) ) { $cache = array(); } if ( ! isset( $args['widget_id'] ) ) { $args['widget_id'] = $this->id; } if ( isset( $cache[ $args['widget_id'] ] ) ) { echo $cache[ $args['widget_id'] ]; return; } ob_start(); $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Commented Posts' ); /** This filter is documented in wp-includes/default-widgets.php */ $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5; if ( ! $number ) { $number = 5; } /** * Filter the arguments for the Commented Posts widget. * * @since 1.0.0 * * @see WP_Query::get_posts() * * @param array $args An array of arguments used to retrieve the commented posts. */ $query_args = [ 'posts_per_page' => $number, 'orderby' => 'comment_count', ]; $q = new WP_Query( apply_filters( 'comment_posts_args', $query_args ) ); if( $q->have_posts() ) { echo $args['before_widget']; if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } while( $q->have_posts() ) { $q->the_post(); ?> 
< ?php the_title( '

', '' ); ?>

< ?php the_excerpt(); ?>
< ?php } wp_reset_postdata(); } echo $args['after_widget']; if ( ! $this->is_preview() ) { $cache[ $args['widget_id'] ] = ob_get_flush(); wp_cache_set( 'widget_commented_posts', $cache, 'widget' ); } else { ob_end_flush(); } } public function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['title'] = strip_tags( $new_instance['title'] ); $instance['number'] = (int) $new_instance['number']; $this->flush_widget_cache(); $alloptions = wp_cache_get( 'alloptions', 'options' ); if ( isset( $alloptions['widget_comment_post'] ) ) delete_option( 'widget_comment_post' ); return $instance; } public function flush_widget_cache() { wp_cache_delete( 'widget_commented_posts', 'widget' ); } public function form( $instance ) { $title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : ''; $number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5; ?>

< ?php } } add_action( 'widgets_init', function () { register_widget( 'Show_Popular_Commented' ); });