Para së të filloj më këtë shkrimin dua të ceki që sot është hera e pare që shkruaj një plugin për Wordpress, dhe kam njohuri shume te kufizuara mbi këtë CMS.

Sot kisha nevojë për një widget/plugin të thjesht në wordpress që mundësonte shfaqjen e x-numër shkrimeve të një kategorie. Pas një kërkimi të shpejt, gjeta disa zgjidhje, por disa ishin shumë të avancuara e disa nuk funksiononin ashtu siç doja unë, kështu që vendosa të krijoj një vet.

Fillojmë atëherë

Që të krijosh një widget/plugin se pari duhet te krijojmë një dosje (folder), nen “wp-content/plugins”, emërimin e zgjidhni vete, pastaj krijojmë një php-file, prapë vendosni vet për emërimin. Unë në shembullin që do marr këtu do e emëroj dosjen “empirio-postrender”, me te njëjtin emër do emeroj dhe php-dokumentin e krijuar.

Wordpress merr te dhënat (emrin, përshkrimin, autorin) e plugin-it përmes komentimit ne dokumentin e po sa krijuar, kështu që fillojmë me atë:

<?php
/*
Plugin Name: Empirio PostRender Widget
Plugin URI: http://www.empirio.no
Description: A widget listing posts from a category
Version: 1.0
Author: Flamur Mavraj
Author URI: http://www.empirio.no
*/

Besoj që është vet shpjeguese pjesa më lart kështu që vazhdojmë duke krijuar një klas (class). Çdo plugin duhet të zgjeroj (extends) klasën bazë “WP_Widget”, në rastin time unë do emeroj klasën “Empirio_PostRender_Widget”, kështu që kodi jone do duket diçka i tille tani:

<?php
class Empirio_PostRender_Widget extends WP_Widget {
    \\ your code here ...
}

Janë 4 funksione që çdo plugin duhet patjetër ti përmbaj:

  • Krye funksioni/konstruktori (cili ka emrin e njëjtë si vete klasa)
  • form (Këtu shfaqim opsionet për konfigurim që pastaj ruhen përmes funksionit “update”)
  • update (Këtu bëjmë azhurnimin e të dhënave nga paneli i administratorit)
  • widget (këtu shfaqim te dhënat në faqe)
Fillojmë me funksionin e pare, e vetmja gjë që nevojitët të bëjmë këtu është të thërrasim funksionin kryesor te klasës baze duke ja dhen si parametër emrin e plugin-it:

<?php
class Empirio_PostRender_Widget extends WP_Widget {
    function Empirio_PostRender_Widget() {
        parent::WP_Widget(false, $name = 'Empirio PostRender Widget');
    }
}

Vazhdojmë me funksionin “form”, ky funksion përmban një parametër te quajtur “$instance” e cila përmban të dhënat.

<?php
class Empirio_PostRender_Widget extends WP_Widget {
    // ...

    function form($instance) {

        $title              = esc_attr($instance['title']);
        $category_id        = esc_attr($instance['category_id']);
        $number_of_posts    = esc_attr($instance['number_of_posts']);
        $template           = esc_textarea($instance['template']);

        $defaults    = array(
            'template' => "<li><a href='%post_link%'>%post_title%</a></li>",
            'number_of_posts' => '5'
        );

        /** Category list */
        $categories = get_categories(array('type' => 'post', 'hide_empty' => 0, 'orderby' => 'name', 'order' => 'ASC', 'taxonomy' => 'category'));

    ?>

    <p>
        <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
    </p>


    <p>
        <label for="<?php echo $this->get_field_id('category_id'); ?>"><?php _e('Category:'); ?></label>
        <select class="widefat" id="<?php echo $this->get_field_id('category_id'); ?>" name="<?php echo $this->get_field_name('category_id'); ?>">
            <option value="-1"<?php if(-1 == $category_id) { ?> selected="selected"<?php } ?>>Select category ...</option>
            <?php foreach($categories as $category) { ?>
                <option value="<?php echo $category->term_id; ?>"<?php if($category->term_id == $category_id) { ?> selected="selected"<?php } ?>><?php echo $category->name.' ('.$category->count.')'; ?></option>
            <?php } ?>
        </select>
    </p>

    <p>
        <label for="<?php echo $this->get_field_id('number_of_posts'); ?>"><?php _e('Number of posts to show:'); ?></label>
        <input id="<?php echo $this->get_field_id('number_of_posts'); ?>" name="<?php echo $this->get_field_name('number_of_posts'); ?>" type="text" value="<?php echo ($number_of_posts ? $number_of_posts : $defaults['number_of_posts']); ?>" size="4" style="text-align: center;"/>
    </p>

    <p>
        <label for="<?php echo $this->get_field_id('tpl'); ?>"><?php _e('Template:'); ?></label>
        <textarea class="widefat" rows="5" cols="4" id="<?php echo $this->get_field_id('template'); ?>" name="<?php echo $this->get_field_name('template'); ?>"><?php echo ($template ? $template : $defaults['template']); ?></textarea>
    </p>

    <?php
    }
}

Të shpjegoj më në detaje këtë funksion, nga linja 7-10 formatojmë të dhënat, duke përdor funksionet bërthame (core) të Wordpress-it, në linjën 12 kemi disa të dhëna standarde, në linjën 18 nxjerrim të dhënat mbi kategoritë nga databaza përmes funksioni get_categories(), dhe ky është funksion nga bërthama e Wordpress-it. Dhe pastaj krijojmë të dhënat e formularit (inputs, textareas ...), funksioni _e() është një funksion ndihmës që ndërlidhet më funksionin translate(), që shfaq fjalinë e përkthyer!

Vazhdojmë më funksionin “update”, i cili ekzekutohet kur bëjmë ruajtjen e informatave të funksionit “form”. Ky funksion përmban dy parametra, te të dhënave të instancës së re dhe asaj të vjetër, dhe këtu bëjmë formatimin e të dhënave para së të ruhen në databaze.

<?php
class Empirio_PostRender_Widget extends WP_Widget {
    // ...

    function update($new_instance, $old_instance) {
        $instance = $old_instance;

        $instance['title']          = strip_tags($new_instance['title']);
        $instance['category_id']    = strip_tags($new_instance['category_id']);
        $instance['number_of_posts']= strip_tags($new_instance['number_of_posts']);
        $instance['template']       = $new_instance['template'];

        return $instance;
    }
}

Tash vazhdojmë më funksionin e fundit, “widget”, dhe ky funksion përmban dy parametra, e para përmban disa të dhëna të vet plugin-it kurse parametri i dyte përmban të dhënat e instancës (formularit).

<?php
class Empirio_PostRender_Widget extends WP_Widget {
    // ...

    function widget($args, $instance) {

        $title = apply_filters('widget_title', $instance['title']);

        $postargs = array(
            'cat' => $instance['category_id'],
            'numberposts' => $instance['number_of_posts'],
            'orderby' => 'date',
            'order' => 'DESC',
        );

        $posts  = get_posts($postargs);
        $output = '';

        $output.= $args['before_widget'];
        $output.= $args['before_title'] . $title . $args['after_title'];

        $output.= '
    '; foreach($posts as $post){ $post_link = get_permalink($post->ID); $post_title= $post->post_title; $post_date = $post->post_date; $output .= str_replace(array('%post_link%', '%post_title%', '%post_date%'),array($post_link, $post_title, $post_date), $instance['template']); } $output .= '
'; $output.= $args['after_widget']; echo $output; } }

Dhe këtu po e shpjegoj pak më në detaje, në linjën 7, vendosim titullin duke aplikuar filtrin “widget_title” përmes funksionit apply_filters(). Në linjën 16 nxjerrim postimët nga databaza përmes funksionit get_posts(), i cili pranon një parametër, ne te cilën ne specifikojmë të dhënat në linjën 9 (nga cila kategori, renditjen, sa postime etj...). Pastaj bëjmë një “loop” të postimeve dhe ruajmë të dhënat në variabëlin $output ku ne fund te funksionit e shtypim.

Ne fund, duhet ta regjistrojmë këtë plugin, këtë e bëjmë në fund të dokumentit, pasi që kemi mbyllur klasën më lart, duke thirrur funksionin add_action() si më poshtë:

<?php
class Empirio_PostRender_Widget extends WP_Widget {
    // ...
}

add_action('widgets_init', create_function('', 'return register_widget("Empirio_PostRender_Widget");'));

Tash shkoni në panelin e administrimit, tek “Plugins->Installed Plugins”, aty do e shikoni pluginin e posa krijuar, aktivizoni dhe pastaj shkoni tek “Appearence->Widgets” dhe tash mundeni ta përdorni këtë plugin si widget në “sidebar”.

Kodin e plote mund ta shkarkoni nga këtu, Empirio PostRender Widget.