Tento článek je součástí série návodů zabývající se kompletní tvorbou WordPress widgetu.
- Co byste měli vědět než se pustíte do tvorby prvního widgetu
- Tvorba a registrace WordPress widgetu
- Tvorba samotného widgetu
- Tvorba formuláře pro váš WordPress widget
- Zobrazení widgetu na stránce
Kódování výstupu widgetu
Tento krok se skládá ze dvou částí:
- Přidání výstupní funkce do widgetu. Tato funkce bude identifikovat nadřazené stránky (rodiče).
- Úprava funkce widgetu uvnitř třídy WP_Widget.
Přidání funkce pro identifikace rodiče
Do souboru pluginu, nad vaší třídu WP_Widget přidejte tuto funkci:
<?php
function
tutsplus_check_for_page_tree() {
// zkontroluje, zda se nacházíte na stránce
if
( is_page() ) {
global
$post
;
// kontroluje, zda má stránka rodiče
if
(
$post
->post_parent ){
// načte seznam rodičů
$parents
=
array_reverse
( get_post_ancestors(
$post
->ID ) );
// najde nejvýše postaveného rodiče
return
$parents
[0];
}
// navrátí ID - toto bude nejvýše postavený rodič nebo ID současné stránky
return
$post
->ID;
}
}
?>
Funkce pro úpravu nastavení widgetu
Dalším krokem je úprava zatím prázdné funkce widgetu. Začneme definováním proměnných, které jsou založené na vstupním formuláři.
function widget( $args, $instance ) {
extract( $args );
echo $before_widget;
echo $before_title . 'In this section:' . $after_title;
}
Dále přidejte dotaz a jeho výstup do funkce widget:
function
widget(
$args
,
$instance
) {
// kick things off
extract(
$args
);
echo
$before_widget
;
echo
$before_title
.
'In this section:'
.
$after_title
;
// run a query if on a page
if
( is_page() ) {
// run the tutsplus_check_for_page_tree function to fetch top level page
$ancestor
= tutsplus_check_for_page_tree();
// set the arguments for children of the ancestor page
$args
=
array
(
'child_of'
=>
$ancestor
,
'depth'
=>
$instance
[
'depth'
],
'title_li'
=>
''
,
);
// set a value for get_pages to check if it's empty
$list_pages
= get_pages(
$args
);
// check if $list_pages has values
if
(
$list_pages
) {
// open a list with the ancestor page at the top
?>
<ul
class
=
"page-tree"
>
<?php
// list ancestor page ?>
<li
class
=
"ancestor"
>
<a href=
"<?php echo get_permalink( $ancestor ); ?>"
><?php
echo
get_the_title(
$ancestor
); ?></a>
</li>
<?php
// use wp_list_pages to list subpages of ancestor or current page
wp_list_pages(
$args
);;
// close the page-tree list
?>
</ul>
<?php
}
}
}
Toto zkontroluje jestli jste na stránce a poté definuje argumenty pro funkci list_pages(). K tomu se použije předchozí funkce a hodnoty $depth, která je nastavená ve formuláři widgetu. Nyní vše uložte a aktualizujte plugin na stránce.
Shrnutí
Tvorba widgetu zahrnuje tyto kroky:
- Registrace widgetu.
- Tvorba třídy, která obsahuje funkce widgetu.
- Napsání funkce construct, která sestavuje widget.
- Napsání funkce form, která obsahuje formulář widgetu.
- Napsání funkce update, která ukládá nastavení formuláře.
- Napsání funkce widget, která obsahuje výstup.
Jakmile máte všechno hotové, máte funkční widget, který můžete upravit tak, aby dělal co chcete.
Celý kód pluginu
<?php /*Plugin Name: Widget Seznam podstránek Description: Tento widget kontroluje, zda má současná stránka nadřazené nebo podřazené stránky. Pokud tomu tak je, pak zobrazí seznam stránek, v kterém se nachází. Version: 0.1 Author: Tomáš Cirkl Author URI: https://www.wplama.cz License: GPLv2 */ ?> <?php function tutsplus_check_for_page_tree() { //zkontroluje, zda se nacházíte na stránce if( is_page() ) { global $post; // zkontroluje, zda má stránka rodiče if ( $post->post_parent ){ // načte seznam rodičů $parents = array_reverse( get_post_ancestors( $post->ID ) ); // najde nejvýše postaveného rodiče return $parents[0]; } // navrátí ID - toto bude nejvýše postavený rodič nebo ID současné stránky return $post->ID; } } ?> <?php class Tutsplus_List_Pages_Widget extends WP_Widget { function __construct() { parent::__construct( // base ID of the widget 'tutsplus_list_pages_widget', // name of the widget __('Seznam příbuzných stránek', 'tutsplus' ), // widget options array ( 'description' => __( 'Identifikuje strukturu současné stránky a zobrazí seznam příbuzných stránek. Funguje pouze u stránek.', 'tutsplus' ) ) ); } function form( $instance ) { $defaults = array( 'depth' => '-1' ); $depth = $instance[ 'depth' ]; // markup for form ?> <p> <label for="<?php echo $this->get_field_id( 'depth' ); ?>">Hlooubka seznamu:</label> <input class="widefat" type="text" id="<?php echo $this->get_field_id( 'depth' ); ?>" name="<?php echo $this->get_field_name( 'depth' ); ?>" value="<?php echo esc_attr( $depth ); ?>"> </p> <?php } function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance[ 'depth' ] = strip_tags( $new_instance[ 'depth' ] ); return $instance; } function widget( $args, $instance ) { // start extract( $args ); echo $before_widget; echo $before_title . 'In this section:' . $after_title; // pokud jste na stránce spustí dotaz if ( is_page() ) { // spustí funkci tutsplus_check_for_page_tree $ancestor = tutsplus_check_for_page_tree(); // nastaví argumenty pro rodiče a stejně postavené stránky $args = array( 'child_of' => $ancestor, 'depth' => $instance[ 'depth' ], 'title_li' => '', ); // nastaví hodnotu pro get_pages $list_pages = get_pages( $args ); // zkontroluje zda $list_pages má nějakou hodnotu if( $list_pages ) { // otevře seznam nadřazených rodičů ?> <ul class="page-tree"> <?php // list ancestor page ?> <li class="ancestor"> <a href="<?php echo get_permalink( $ancestor ); ?>"><?php echo get_the_title( $ancestor ); ?></a> </li> <?php // použije wp_list_pages pro sestavení podřazených stránek a současné stránky wp_list_pages( $args );; // uzavře seznam ?> </ul> <?php } } } } ?> <?php function tutsplus_register_list_pages_widget() { register_widget( 'Tutsplus_List_Pages_Widget' ); } add_action( 'widgets_init', 'tutsplus_register_list_pages_widget' ); ?>
Ahoj, řeším teď takový problém: Mám proměnnou ve „function form($instance) {}“ a chtěl bych s ní pracovat ve „function widget($args, $instance) {}“. Zkoušel jsem to pomocí globálních proměnných, ale nefungovalo mi to. Jsem v PHP začátečník, tak jsem to asi špatně napsal. Nemůžete mi prosím někdo pomoci? Předem děkuji 🙂
Ahoj. Poradit určitě můžeme. Potřeboval bych ale ten tvůj kód vidět. Pokud není moc dlouhý tak ho sem hoď a něco vymyslíme.
Chybi tam $after_widget, pokud se nemylim.