Ich versuche, ein Widget zu erstellen, das Posts in der Seitenleiste anzeigt, die Post-IDs als Eingaben des Benutzers verwenden.
Das Ergebnis meines Codes ist, dass das Widget nur die erste eingegebene ID anzeigt und die anderen ignoriert.
Beispiel: Wenn meine Eingabe im Widget 1236, 1234, 1235 ist, zeigt das Widget-Frontend nur den Post mit der ID 1236 an.
Dies ist der Code meines Widgets:
'Post in Sidebar lets you choose some App Reviews and show them in the sidebar' ) ); // Description } public function widget( $args, $instance ) { // Frontend extract($args, EXTR_SKIP); echo $before_widget; $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']); if (!empty($title)) echo $before_title . $title . $after_title; // start postInSidebar frontend $wp_query = new WP_Query( array ( 'post_type' => 'post', 'post__in' => array($instance['postsToShow']), 'orderby' => 'post__in' )); ?> have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?> <div id="post-" > <a href="https://wordpress.stackexchange.com/questions/99549/widget-to-show-posts-in-the-sidebar-basing-on-its-ids/" title=""> -
No posts yet, go to appearance -> widgets and choose which posts to show here.
'', 'postsToShow' => '' )); $instance['title'] = strip_tags($new_instance['title']); $instance['postsToShow'] = strip_tags($new_instance['postsToShow']); return $instance; } public function form( $instance ) { // Backend $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'postsToShow' => '' )); $title = esc_attr($instance['title']); $postsToShow = esc_attr($instance['postsToShow']); ?><label for="get_field_id('title'); ?>"> Title: <input class="widefat" id="get_field_id('title'); ?>" name="get_field_name('title'); ?>" type="text" value="" />
<label for="get_field_id('postsToShow'); ?>"> Posts To Show: <input class="widefat" id="get_field_id('postsToShow'); ?>" name="get_field_name('postsToShow'); ?>" type="text" value="" />
<?php } } add_action( 'widgets_init', function(){ register_widget( 'postInSidebar' ); });Versuchen Sie zu ersetzen
'post__in' => array($instance['postsToShow']),
mit
'post__in' => explode(",", $instance['postsToShow']),
um den post__in
mit einem Array zu füttern.
Ihr aktuelles Array sieht folgendermaßen aus
array("123,456,789")
aber sollte wie sein
array("123", "456", "789")
Wenn $instance['postsToShow']
eine durch Komma getrennte ID-Kette ist, dann erzeugt array($instance['postsToShow'])
ein Array, das aus einem Element besteht, das buchstäblich 1236, 1234, 1235
. Das ist nicht das, was Sie wollen .
Benutze php’s explode
, um deine Zeichenkette in ein Array zu konvertieren:
'post__in' => explode( ',', $instance['postsToShow'] )