Wordpress jest bardzo elastyczny i może być konfigurowany na wiele sposobów. Wygląd strony zmieniamy generalnie poprzez themes, które kopiujemy na serwer i wybieramy w panelu administracyjnym. W tym samym panelu może włączyć dodatkowe elementy, tzw. widgets, które zwiększają funkcjonalność naszej strony. Możemy również ustalić porządek wyświetlania widgetów lub miejsce ich wyświetlania. Do wyboru jest kalendarz, archiwum wpisów, wyszukiwarka i wiele innych. Co jednak w sytuacji, gdy nie znajdziemy tego czego potrzebujemy. Najlepiej napisać własny widget, dokładnie taki jaki chcemy.
Zadanie
Potrzebujemy widgeta, który będzie wyświetlał dwa ostatnie wpisy z kategorii “Książki”. Standardowo dostępny widget Recent Entries wyświetla określoną ilość ostatnich wpisów. Najłatwiejszą drogą stworzenia naszego widgeta jest skopiowanie kodu tego widgeta i ograniczenie wyszukiwania w zapytaniu do bazy danych.
Oczywiście nasz widget może robić coś więcej niż tylko wyświetlać tytuły ostatnich wpisów z danej kategorii. Moja strona korzysta z analogicznego widgeta, ale dodatkowo wyświetla okładki książek oraz link do kategorii z wszystkimi książkami. Możliwości modyfikacji jest wiele, po to aby nasza strona była ciekawsza.
Rozwiązanie
Całość kodu, który modyfikujemy znajduje się w pliku widgets.php, w katalogu wp-includes/. Należy zwrócić szczególną uwagę na sposób zapisu kodu PHP, ponieważ Wordpress nie posiada separacji warstwy logicznej i prezentacyjnej. Innymi słowy pomiędzy kod PHP wplecione są znaczniki HTML.
Rozpoczynamy od skopiowania kodu wigdeta Recent Entries. Będą to oryginalne funkcje, które zmodyfikujemy na potrzeby naszego zadania.
function wp_widget_recent_entries($args) {
...
}
function wp_flush_widget_recent_entries() {
...
}
function wp_widget_recent_entries_control() {
...
}
Pierwsza funkcja jest odpowiedzialna za pobranie danych z bazy oraz późniejsze ich wyświetlenie. Druga funkcja przeładowuje widget, jeśli zaistnieje taka potrzeba. a ostatnia umożliwia konfigurowanie widgeta w panelu administracyjnym. Zmieniamy nazwy funkcji i odpowiednich elementów z entries na books.
W poniższym kodzie najważniejszy fragment to &category_name=ksiazki zmieniający zapytanie do bazy danych. W ten sposób ograniczamy wyszukiwanie jedynie do kategorii “książki”. Istotne jest, abyśmy mieli taką kategorię, jak również jakieś kilka wpisów.
Widget wyświetla liczbę ostatnich postów w zależności od wartości zapisanej w bazie danych, ale nie mniej niż jeden i nie więcej niż piętnaście. Same odnośniki i tytuły wpisów są wyświetlane w liście nieuporządkowanej. Na końcu potrzebujemy znacznika </li>, który zamknie prawidłowo element listy z naszym widgetem. W naszym przypadku znacznik dopisujemy do $after_widget, zaraz po linku “Więcej książek”.
function wp_widget_recent_books($args) {
if ( $output = wp_cache_get('widget_recent_books', 'widget') )
return print($output);
ob_start();
extract($args);
$options = get_option('widget_recent_books');
$title = empty($options['title']) ? __('Recent Books') : $options['title'];
$after_widget = '<a href="http://adamczuk.net.pl/category/ksiazki">Więcej książek</a></li>';
if ( !$number = (int) $options['number'] )
$number = 10;
else if ( $number < 1 )
$number = 1;
else if ( $number > 15 )
$number = 15;
$r = new WP_Query("showposts=$number&what_to_show=posts&nopaging=0&post_status=publish&category_name=ksiazki");
if ($r->have_posts()) :
?>
<?php echo $before_widget; ?>
<?php echo $before_title . $title . $after_title; ?>
<ul>
<?php while ($r->have_posts()) : $r->the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php echo $after_widget; ?>
<?php
wp_reset_query();
endif;
wp_cache_add('widget_recent_books', ob_get_flush(), 'widget');
}
Druga funkcja nie robi nic poza przeładowaniem zawartości naszego widgeta.
function wp_flush_widget_recent_books() {
wp_cache_delete('widget_recent_books', 'widget');
}
Zanim zajmiemy się ostatnią funkcją powinniśmy dodać do kodu następujące dwie linijki. Funkcje te przeładowują naszego widgeta w odpowiednich sytuacjach.
add_action('save_book', 'wp_flush_widget_recent_books');
add_action('book_deleted', 'wp_flush_widget_recent_books');
Ostatnia funkcja pozwala na zmianę tytułu naszego widgeta ze standardowego Recent Books na dowolny ciąg znaków, przykładowo Czytane książki. Możemy także wybrać liczbę wyświetlanych wpisów. Na tym możliwość konfiguracji się kończy.
function wp_widget_recent_books_control() {
$options = $newoptions = get_option('widget_recent_books');
if ( $_POST["recent-books-submit"] ) {
$newoptions['title'] = strip_tags(stripslashes($_POST["recent-books-title"]));
$newoptions['number'] = (int) $_POST["recent-books-number"];
}
if ( $options != $newoptions ) {
$options = $newoptions;
update_option('widget_recent_books', $options);
wp_flush_widget_recent_books();
}
$title = attribute_escape($options['title']);
if ( !$number = (int) $options['number'] )
$number = 5;
?>
<p><label for="recent-books-title"><?php _e('Title:'); ?> <input class="widefat" id="recent-books-title" name="recent-books-title" type="text" value="<?php echo $title; ?>" /></label></p>
<p>
<label for="recent-books-number"><?php _e('Number of posts to show:'); ?> <input style="width: 25px; text-align: center;" id="recent-books-number" name="recent-books-number" type="text" value="<?php echo $number; ?>" /></label>
<br />
<small><?php _e('(at most 15)'); ?></small>
</p>
<input type="hidden" id="recent-books-submit" name="recent-books-submit" value="1" />
<?php
}
Podsumowanie
Przedstawiony sposób jest moim zdaniem najprostszym w jaki możemy stworzyć opisaną funkcjonalność dla naszego bloga. Oczywiście najprostszy nie oznacza najlepszy.
W pierwszej wersji mojego widgeta wykorzystywałem dodatkową tabele w bazie danych, która przechowywała nazwy plików dla odpowiednich wpisów. Wówczas konieczne było używanie specjalnej funkcji do pobrania informacji o obrazkach.
Nowe rozwiązanie pobiera jedynie tytuły wpisów. Niepotrzebna jest tabela z nazwami obrazków, ponieważ obecne rozwiązanie pobiera tylko identyfikator posta, który jest również nazwą obrazka dla danego wpisu.
W sytuacji, gdy chcielibyśmy mieć dwa lub więcej podobnych widgetów, przykładowo do wyświetlania oglądanych filmów lub słuchanych płyt możemy ponownie skopiować i zmodyfikować przedstawiony widget. Jednak bardziej wydajne byłoby zmodyfikowanie poprzedniego w ten sposób, aby umożliwiał wielokrotne uruchomienie jak widget tekstowy oraz pozwalał na wybór kategorii wpisów, które będą wyświetlane.






22 Jul 2008, 17:07
GA1kCz qv8032ry07vdd91vdsv0ylv7y4
24 Jul 2008, 03:55
I love this site why adults always lie zlzddo
24 Jul 2008, 06:16
Good crew it’s cool
order porn dvds by mail =))