Maak je eigen WordPress widgets voor Orbis

Karel-Jan 26 november 2014

We krijgen veel feature requests voor Orbis. Eén vraag die we vaak krijgen gaat over de implementatie van extra widgets. Widgets voor bijvoorbeeld het tonen van specifieke projecten binnen een categorie of een widget waarmee de personen van een specifiek bedrijf getoond kunnen worden. Het is vrij eenvoudig om deze widgets zelf te ontwikkelen. In deze blog een head start voor de implementatie ervan.

Allereerst zul je een child theme van Orbis moeten maken. In deze child theme kunnen we vervolgens aanpassingen of uitbreidingen doen. In ons geval willen we Orbis uitbreiden met een extra widget. In dit voorbeeld laat ik zien hoe je de laatste Orbis projecten kan tonen. De widget bevat de volgende code en slaan we op als class-orbis-widget-projects.php in de map /widgets.

<br />
class Orbis_Widget_Projects extends WP_Widget {</p>
<p>	public function __construct() {<br />
		$widget_ops = array(<br />
			'classname'   =&gt; 'widget_orbis_projects',<br />
			'description' =&gt; __( 'A list of Orbis projects.', 'orbis' )<br />
		);</p>
<p>		parent::__construct( 'projects', __( 'Projects', 'orbis' ), $widget_ops );<br />
	}</p>
<p>	public function widget( $args, $instance ) {<br />
		$title   = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Projects', 'orbis' ) : $instance['title'], $instance, $this-&gt;id_base );<br />
		$number  = isset( $instance['number'] ) ? $instance['number'] : 5;</p>
<p>		$query = new WP_Query( array (<br />
			'post_type'      =&gt; 'orbis_project',<br />
			'posts_per_page' =&gt; $number,<br />
			'no_found_rows'  =&gt; true,<br />
		) );</p>
<p>		if ( $query-&gt;have_posts() ) {<br />
			echo $args['before_widget'];</p>
<p>			if ( $title ) {<br />
				echo $args['before_title'] . $title . $args['after_title'];<br />
			}</p>
<p>			?&gt;</p>
<p>			&lt;ul&gt;<br />
				&lt;?php while ( $query-&gt;have_posts() ) : $query-&gt;the_post(); ?&gt;</p>
<p>					&lt;li&gt;<br />
						&lt;a href=&quot;&lt;?php the_permalink(); ?&gt;&quot;&gt;&lt;?php the_title(); ?&gt;&lt;/a&gt;<br />
					&lt;/li&gt;</p>
<p>				&lt;?php endwhile; ?&gt;<br />
			&lt;/ul&gt;</p>
<p>			&lt;?php</p>
<p>			echo $args['after_widget'];</p>
<p>			wp_reset_postdata();<br />
		}<br />
	}</p>
<p>	public function update( $new_instance, $old_instance ) {<br />
		$instance = $old_instance;</p>
<p>		$instance['title']  = strip_tags($new_instance['title'] );<br />
		$instance['number'] = ! empty( $new_instance['number'] ) ? intval( $new_instance['number'] ) : 1;</p>
<p>		return $instance;<br />
	}</p>
<p>	function form( $instance ) {</p>
<p>		$title  = isset( $instance['title'] ) ? $instance['title'] : '';<br />
		$number = isset( $instance['number'] ) ? $instance['number'] : '';</p>
<p>		?&gt;</p>
<p>		&lt;p&gt;<br />
			&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id( 'title' ); ?&gt;&quot;&gt;<br />
				&lt;?php _e( 'Title:', 'orbis' ); ?&gt;<br />
			&lt;/label&gt;</p>
<p>			&lt;input class=&quot;widefat&quot; id=&quot;&lt;?php echo $this-&gt;get_field_id( 'title' ); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name( 'title' ); ?&gt;&quot; type=&quot;text&quot; value=&quot;&lt;?php echo esc_attr( $title ); ?&gt;&quot; /&gt;<br />
		&lt;/p&gt;</p>
<p>		&lt;p&gt;<br />
			&lt;label for=&quot;&lt;?php echo $this-&gt;get_field_id( 'number' ); ?&gt;&quot;&gt;<br />
				&lt;?php _e( 'Number:', 'orbis' ); ?&gt;<br />
			&lt;/label&gt;</p>
<p>			&lt;input class=&quot;widefat&quot; id=&quot;&lt;?php echo $this-&gt;get_field_id( 'number' ); ?&gt;&quot; name=&quot;&lt;?php echo $this-&gt;get_field_name( 'number' ); ?&gt;&quot; type=&quot;text&quot; value=&quot;&lt;?php echo esc_attr( $number ); ?&gt;&quot; /&gt;<br />
		&lt;/p&gt;</p>
<p>		&lt;?php<br />
	}<br />
}</p>
<p>register_widget( 'Orbis_Widget_Projects' );</p>
<p>

Dit bestand kan je geheel naar eigen wens aanpassen. Deze class voegen we vervolgens toe aan functions.php binnen het child theme met de volgende include.

</p>
<p>require_once( 'widgets/class-orbis-widget-projects.php' );</p>
<p>

0 reacties

Altijd op de hoogte blijven?