Co to jest widget?
Widget jest to pewna forma funkcjonalności, odmiana pluginu WP, umieszczany w sidebarze WP w back-endzie WP.

Co robi nasz przykładowy Widget?
Widget printuje posty, kategorie oraz taxonomie( kategorie oraz tagi).

Funkcjonalność Widgetu.
Każdy widget posiada swój back-end i front-end. W naszym przykładzie może:
– określać jaki ma być tytuł we front-endzie widgetu
– określać jaki typ treści ma być wyświetlany: posty czy strony( page)
– określać ilość wpisów, komentaarzy
– wybiera pożądane taxonomie
– daje możliwość włączenia i wyłączenia avatara, autora , daty, i treści komentarzy.

<?php

/*
Plugin Name: Moj Widget
Plugin URI: https://www.websitecreator.pl
Description: Wpisy strony, kategorie, tag cloud,komentarze AJAX
Author: Pawel Kalisz
Version: 1.0
Author URI: https://www.websitecreator.pl
*/

class Moj_Widget extends WP_Widget{//klasa nowego widgetu jest rozszerzeniem klasy wbudowanej widgetu WP wp_widget

function __construct(){

$widget_options = array(//tabllica ssocjacyjna widget options
‘classname’ => ‘moj-widget’,//id klasy widgetu bedzie wspoltowrzyl np wartosci id inputow( firebug)
‘description’ => ‘Wpisy, tagi’//opis widgetu
);

//wywolanie construktoa rodzicielskiego widgetu param:id klasy widgetu,opis widgetu w jego naglowku back end, tablica //opcji widgetu
parent::__construct(‘moj-widget’, ‘Mój Widget, wpisy, itp…’, $widget_options);
}
//wyglad widgetu po stronie front endu , widget built in WP
//param:args built in wp , zawiera tablice indexow ; befrore widget, after widget befor after- title, tutaj uzycie //extract( args), okresla co jest umiejscowoweione w html pprzed po tytule i widgecie
//instance tablica opcji widgetu
function widget($args, $instance){

/*extract -PHP importuje tablice oprzyjhmowana w param, nastepnie konwertuja ja na key jako nazwa zmiennej a value jako jej wartosc ( zmiennej), inaczej bylby wymagany zapis np. args[‘before_title’] */
extract($args);

$title1 = (!empty($instance[‘title1’])) ? $instance[‘title1’] : ‘Widget’;//jesli wartosc pola nie jest pusta wstaw //jegopo wartosc jesli jest pusta wstaw napis widget

$title2 = (!empty($instance[‘title2’])) ? $instance[‘title2’] : ‘Moj’;//podobnie do drugie tytulu
/* $instance[‘entries_count’] WP- tablica liczby wpisow- ustaklenie domyslnej wartosci w razie nie okrewslenia zadnej*/
$entries_count = (!empty($instance[‘entries_count’])) ? (int)$instance[‘entries_count’] : 5;

//entry type index tablicy instance okreslajacy typ postu , tutaj domyslny : post wbudowany(mozliwosc wpr., nazwy //posta customowwego)
/* inne mozliwe entry type:

Page (Post Type: ‘page’)
Attachment (Post Type: ‘attachment’)
Revision (Post Type: ‘revision’)
Navigation menu (Post Type: ‘nav_menu_item’)
*/
$entry_type = (!empty($instance[‘entry_type’])) ? $instance[‘entry_type’] : ‘post’;

echo $before_widget;//printowanie html prze i po widgecie oraz tytule widgeta, buil in WP
echo $before_title.$title1.$after_title;
echo $before_title2.$title2.$after_title2;

$loop = new WP_Query(array(//tworzenie customowej petli o nazwie loop korzytsanie z klasy wp_query( wp)
‘post_type’ => $entry_type,//typ posta okreslony w entry type
‘posts_per_page’ => $entries_count//liczba postow na stronie okrelson w entries count
));

if(!$loop->have_posts()){//gdy nie ma wpisow wtakiej petli
echo ‘<p>Brak wpisów</p>’;
}else{

echo ‘<ul>’;
while($loop->have_posts()){//rozpoczecie printowania zawartosci postow
$loop->the_post();

?><li><a href=”<?php the_permalink(); ?>”><?php the_title() ?></a></li><?php
}
echo ‘</ul>’;

}

echo $after_widget; //printowanie html za widgetem ( html powinien byc okreslony w pliku functions szablonu)
}

//budowanie widgetu od strony back end( formularz)
function form($instance){//instace WP przyjmowane opcje
?>
<!–get_field_id(‘title1’)-WP- zwroci -widget-moj-widget-2-title1- z czego widget moj jest id widgetu –>
<label for=”<?php echo $this->get_field_id(‘title1’) ?>”>
Nagłówek 1:<!–get_field_name-WP ZWROCI:widget-moj-widget[2][title1] firebug –>
<input
type=”text”

name=”<?php echo $this->get_field_name(‘title1’) ?>”
id=”<?php echo $this->get_field_id(‘title1’) ?>”
value=”<?php echo esc_attr($instance[‘title1’]);?>” />
</label>
<br/>
<label for=”<?php echo $this->get_field_id(‘title2’) ?>”>
Nagłówek 2:
<input
type=”text”
name=”<?php echo $this->get_field_name(‘title2’) ?>”
id=”<?php echo $this->get_field_id(‘title2’) ?>”
value=”<?php echo esc_attr($instance[‘title2’]); ?>” />
</label>
<br/>
<label for=”<?php echo $this->get_field_id(‘entry_type’)// pobierze id pola(firebug) ?>”>
Typ wpisów:
<select
name=”<?php echo $this->get_field_name(‘entry_type’)//name pola ?>”
id=”<?php echo $this->get_field_id(‘entry_type’) //id pola typu wpisow?>”
>
<?php
/* get_post_types WP zwraca typy postow zarejstrowane w $wp_post_types.
param: tablica asocjacuyjna dopasowana do typow postow, typ wyniku wyjsciowego tutaj object*/
$entries_types_list = get_post_types(NULL, ‘object’);// jest to tablica
$exclude = array(‘attachment’, ‘revision’, ‘nav_menu_item’);//tablica listy typow wykluczonych WP

$curr_type = $instance[‘entry_type’];//za biezacy typ posta podstaw wartosc typu posta
//petla
foreach($entries_types_list as $type){//za liste typo posta podstaw tmczas., type
$name = $type->name;//za name podstaw wartosc wlasciwoswsci name listy typow posta

/* jesli w exclude nie ma danego typu posta (post i page )*/

if(!in_array($name, $exclude)){//in array PHP – przeszukiwanie inndexow w tablicy
/* param: name- wartosc jaka jest szukana, exclude – tablica w ktrej ta wartosc bedzie zukana */
$label = $type->labels->name;//wyciagnij nazwe typu posta post lub page
if($curr_type == $name){//jesli biezacy typ bedzie mial wartosc name przy spr., to printuj( //firebug), ponizej piewrwszq wartosc zqznaczony z listy select i druga
echo ‘<option selected=”selected” value=”‘.$name.'”>’.$label.'</selected>’;
}else{
echo ‘<option value=”‘.$name.'”>’.$label.'</selected>’;
}
}
}
?>
</select>
</label>
<br/>
<label for=”<?php echo $this->get_field_id(‘entries_count’) ?>”>
Ilość wpisów:
<select
name=”<?php echo $this->get_field_name(‘entries_count’) ?>”
id=”<?php echo $this->get_field_id(‘entries_count’) ?>”
>
<?php //printowanie tagow option ( spod select)
$opts = array(5, 10, 15);//tablica wartosci pol html options
$curr = (int)esc_attr($instance[‘entries_count’]);// za biezace option podstaw konwersje na int wartosci //entries count
foreach($opts as $val){//val jako tymczasowa reprrezentqacja opts
if($curr == $val){//jesli biezaca wartosc ma ma wartosc opts to printuj:
echo ‘<option selected=”selected” value=”‘.$val.'”>’.$val.'</selected>’;
}else{
echo ‘<option value=”‘.$val.'”>’.$val.'</selected>’;
}
}
?>
</select>
</label>
<?php
}

}
//rejestracja widgetu param: nazwa klasy widgetu
function moj_widget_init(){
register_widget(‘Moj_Widget’);
}
// popiecie do haka widgets init nazwy funkcji inicjalizacji rejestracje widgetu
add_action(‘widgets_init’, ‘moj_widget_init’);