Reklama sponsora

6. Baza danych



Wstęp

Platforma WordPress posiada kilka swoich bardzo uniwersalnych tabel, które pasują w większości zastosowań a ponadto aby wykonać jakąś operację jak dodanie posta lub jakiejś opcji nie trzeba pisać bezpośredniego zapytania do bazy tylko wystarczy wykorzystać już gotową funkcję. Jednak czasami zdarzają się sytuacje, w których wygodniej jest po prostu stworzyć własną tabelę do przechowywania sporej ilości lub dość specyficznych danych.

Do tworzenia tabel i zarządzania ich strukturą oraz tworzenia zapytań SQL wykorzystujemy obiekt $wpdb.

Aby zaprezentować sposób działania na bazie danych stworzymy bardzo prostą wtyczkę. Przy aktywacji sprawdzimy czy tabela została już wcześniej dodana i jeśli nie to ją utworzymy. Następnie w kokpicie stworzymy stronę z formularzem umożliwiającym dodanie rekordu do utworzonej tabeli, formularz wykorzystamy także przy edycji. Pod formularzem utworzymy tabelę zawierająca wszystkie rekordy wraz z opcjami usunięcia i edycji. Przy usuwaniu wtyczki usuniemy także naszą tabelę aby baza była tak samo uporządkowana po odinstalowaniu wtyczki jak przed.

Do tej pory tworzyliśmy nic nie robiące wtyczki prezentujące jedynie wykorzystanie funkcji oferowanych przez platformę. Dzisiaj dodatkowo utworzymy Widget umożliwiający dodawanie rekordów do naszej tabeli tak aby w ten sposób utworzyć bardzo prosty czat.

Naszą wtyczkę nazwiemy „ZWP Czat” (ZWP od ZaawansowanyWordpress oczywiście 🙂 ). W tym wpisie do zrobienia także jest całkiem sporo a więc bierzmy się do pracy.

Tworzenie i usuwanie tabeli

Zaczniemy standardowo od utworzenia katalogu naszej wtyczki, który nazwiemy zwp_czat w katalogu umieszczamy plik PHP o tej samej nazwie oraz zmodyfikowany kod z części pierwszej (komentarz nagłówkowy i strona panelu administracyjnego). Tym razem spróbujemy utworzyć klasę i napisać wtyczkę odrobinę bardziej obiektowo. Kod nagłówkowy jest całkowicie analogiczny zaś po utworzeniu klasy zaszły drobne zmiany głównie w przekazywaniu nazwy funkcji. Z nowych rzeczy najpierw tworzymy klasę następnie jej konstruktor i w nim zaczepiamy akcję dodającą nasze menu. Funkcje pozostają bez zmian, na końcu należy pamiętać o utworzeniu obiektu. Poniżej kod:

 

class ZWP_Czat {
    function ZWP_Czat(){
        add_action( 'admin_menu', array( &$this, 'zwpc_add_menu' ));
    }

    function zwpc_add_menu(){
        add_menu_page( 'ZWP Czat', 'ZWP Czat', 'administrator', 'zwp-czat', array( &$this, 'zwpc_main_page'), '', 33 );
    }

    function zwpc_main_page(){
        echo "Hello World";
    }
}

$ZWP_Czat = new ZWP_Czat();

 

Z tej części najbardziej będzie nas interesować funkcja zwpc_main_page jednakże najpierw zajmiemy się aktywacją naszej wtyczki gdzie stworzymy naszą tabelę czatu. Tabelę nazwiemy zwpc_posts, pamiętając o dodaniu prefiksu i będziemy w niej przechowywać posty.

Na początek wykorzystujemy register_activation_hook() opisaną Tutaj aby zarejestrować funkcję aktywującą, w której umieścimy kod odpowiedzialny za utworzenie tabeli.

Na początku funkcji odwołamy się do zmiennej $wpdb zawierającej obiekt bazy danych, następnie wykorzystamy ją do pozyskania prefiksu zdefiniowanego w pliku konfiguracyjnym WordPress-a. Przed utworzeniem tabeli spróbujemy pobrać z bazy tabelę zawierającą nazwę naszej tabeli i porównać ją z nazwą naszej tabeli. Jeśli wtyczka była dezaktywowana i teraz jest aktywowana ponownie, nasza tabela już istnieje.

Kolejnym krokiem jest utworzenie zapytania zawierającego polecenie utworzenia tabeli o zdefiniowanej wcześniej nazwie i strukturę danych. Gotowe zapytanie przekazujemy do metody query() obiektu $wpdb, która jako parametr pobiera ciąg tekstowy zapytania. Poniżej kod aktywacji wtyczki.

 

register_activation_hook(__FILE__, 'zwpc_activation');

function zwpc_activation() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'zwpc_posts';

    if ($wpdb->get_var("SHOW TABLES LIKE '" . $table_name . "'") != $table_name) {
        $query = "CREATE TABLE " . $table_name . " (
        id int(9) NOT NULL AUTO_INCREMENT,
        user_id MEDIUMINT(6) NOT NULL,
        post_content TEXT NOT NULL,
        create_date TIMESTAMP NOT NULL,
        PRIMARY KEY  (id)
        )";

        $wpdb->query($query);
    }
}

Skoro zajęliśmy się instalacją warto także utworzyć kod uruchamiany przy usuwaniu wtyczki. W tym celu tworzymy plik uninstall.php i w analogiczny sposób jak przy tworzeniu tabeli usuwamy ją. Poniżej kod odpowiedzialny za odinstalowanie.

 

<?php
if( !defined( 'WP_UNINSTALL_PLUGIN' ))
    exit();
//usuwam tabelę
global $wpdb;
$table_name = $wpdb->prefix . 'zwpc_posts';
$query ='DROP TABLE '.$table_name;
$wpdb->query($query);

Teraz możemy zainstalować naszą wtyczkę. Po aktywacji w naszej bazie powinna pojawić się nowa tabela jak na obrazku poniżej. Można ją odnaleźć wykorzystując phpmyadmina.

6_1

Dodawanie danych

Teraz skoro już mamy naszą tabelę warto dodać do naszej klasy głównej dwie zmienne przechowujące obiekt $wpdb oraz nazwę tabeli. Można to zrobić w następujący sposób.

 

private $wpdb;
private $table_name;

function ZWP_Czat(){
    global $wpdb;
    $this->wpdb = $wpdb;
    $this->table_name = $wpdb->prefix . 'zwpc_posts';
    add_action( 'admin_menu', array( &$this, 'zwpc_add_menu' ));
}

Teraz mamy nieco łatwiejszy dostęp do tych danych w obrębie klasy. Możemy spokojnie przejść do dodawania danych. Utworzymy prosty formularz i umieścimy go w funkcji odpowiedzialnej za wyświetlanie strony wpisu. Przed formularzem sprawdzimy czy został wysłany i jeśli tak to wywołamy funkcję dodającą post. W formularzu umieścimy dodatkowe pole o nazwie zwpc_action ponieważ wykorzystamy go także przy edycji, aby nie pisać tego samego dwa razy. Warto zwrócić uwagę na prefiks, który w pewien sposób zabezpiecza nas przed kolizją. Poniżej kod funkcji zwpc_main_page.

 

function zwpc_main_page(){
    if(isset($_POST['zwpc_action'])) {
        if($_POST['zwpc_action'] == 'add') {
            if($this->add_post($_POST['post_content'])) {
                $notice = '<div class="notice notice-success">Dodano posta o treści: ' . $_POST['post_content'] . '</div>';
            } else {
                $notice = '<div class="notice notice-error">Nie dodano posta o treści: ' . $_POST['post_content'] . '</div>';
            }
        }
    }
    ?>
        <div class="warp">
            <h2><span class="dashicons dashicons-admin-comments"></span>ZWP Czat</h2>
            <?= isset($notice) ? $notice : '';?>
            <form method="POST">
                <input type="hidden" name="zwpc_action" value="add" />
                <label for="post_content">Treść posta</label><br>
                <input type="text" name="post_content" value="" placeholder="Treść posta"/>
                <input type="submit" value="Dodaj post" class="button-primary"/>
            </form>
        </div>
    <?php
}

Teraz napiszemy funkcję odpowiedzialną za dodanie wiadomości. Pobieramy tutaj tylko jeden parametr, treść wiadomości. Następnie sprawdzamy czy wiadomość nie jest pusta oraz upewniamy się czy wysłał ją jeden z zarejestrowanych użytkowników serwisu. Jeśli wszystko się zgadza to pobieramy identyfikator użytkownika wykorzystując w tym celu funkcję get_current_user_id(). Kolejny bardzo ważnym krokiem jest przefiltrowanie danych otrzymanych od użytkownika w celu usunięcia potencjalnie niebezpiecznych znaczników. Dane do bazy dodajemy za pomocą metody obiektu wpdb o nazwie insert( $table, $data, $format), który pobiera trzy parametry:

  • $table – nazwa tabeli (wcześniej przygotowaliśmy zmienną $table_name)
  • $data – dane w postaci tablicy assocjacyjnej w postaci array( ‚kolumna’ => ‚wartość’)
  • $format – (opcjonalnie) tablica zawierająca formaty danych w postaci array( ‚%s’, ‚%d’)

Na koniec zwracamy prawdę oznaczającą że dodaliśmy dane.

 

function add_post($post_content) {
    //sprawdzam czy nie pusty i czy jest zalogowany
    if(trim($post_content) != '' && is_user_logged_in()){
        $user_id = get_current_user_id();
        $post_content = esc_sql($post_content);
        $this->wpdb->insert( $this->table_name, array('user_id' => $user_id, 'post_content' => $post_content) );
        return TRUE;
    }
    return FALSE;
}

Następnym krokiem będzie wyświetlenie dodanych rekordów.

Zwracanie danych

Wyświetlenie naszych postów będzie jeszcze łatwiejsze. Utworzymy funkcję, która zwraca tablicę wiadomości a następnie dodamy tabelę pod formularzem dodawania, w której znajdą się dodane wiadomości. Na wszelki wypadek ograniczymy ilość rekordów do 100. Aby pobrać wiadomości wykorzystamy metodę obiektu $wpdb o nazwie get_results(), która pobiera parametr w postaci zapytania sql i zwraca tablicę wyników lub FALSE jeśli nie znajdzie pasujących danych. A poniżej kod funkcji get_zwpc_posts().

 

function get_zwpc_posts() {
    return $this->wpdb->get_results("SELECT * FROM $this->table_name ORDER BY create_date DESC LIMIT 0,100");
}

A teraz kod funkcji strony głównej wtyczki. Tym razem dodamy jeszcze dwie akcje do sprawdzenia i ich funkcje. Pierwsza z nowych akcji to edycja wiadomości druga to jej usunięcie. Czasami warto dodać takie opcje aby mieć jakąkolwiek kontrolę nad użytkownikami, którzy zachowują się niezbyt kulturalnie. Następnie dostosujemy formularz tak aby w momencie edycji były do niego wczytywane dane aktualnie edytowanej wiadomości. Niżej zostaje nam już tylko tabela z części czwartej, w której umieścimy nasze dane. Dodatkowo warto przy każdym rekordzie dodać formularz pozwalający na edycję oraz usunięcie rekordu. A teraz rzućmy okiem na kod. najpierw obsługa akcji usuwania i edycji.

 

if(isset($_POST['zwpc_action'])) {
    if($_POST['zwpc_action'] == 'add') {
        //Dodawanie wiadomości
        if($this->add_post($_POST['post_content'])) {
            $notice = '<div class="notice notice-success">Dodano wiadomość o treści: ' . $_POST['post_content'] . '</div>';
        } else {
            $notice = '<div class="notice notice-error">Nie dodano wiadomość o treści: ' . $_POST['post_content'] . '</div>';
        }
    } else if($_POST['zwpc_action'] == 'edit') {
        //edycja wiadomości
        if($this->edit_post($_POST['zwpc_post_id'],$_POST['post_content'])) {
            $notice = '<div class="notice notice-success">Edytowano wiadomość o treści: ' . $_POST['post_content'] . '</div>';
        } else {
            $notice = '<div class="notice notice-error">Nie udało się zaktualizować wiadomości o treści: ' . $_POST['post_content'] . '</div>';
        }
    }
}

if(isset($_POST['zwpc_delete'])) {
    //usuwanie wiadomości
    if($this->delete_post($_POST['zwpc_post_id'])) {
        $notice = '<div class="notice notice-success">Usunięto wiadomość id: ' . $_POST['zwpc_post_id'] . '</div>';
    } else {
        $notice = '<div class="notice notice-error">Nie usunięto wiadomość o id: ' . $_POST['zwpc_post_id'] . '</div>';
    }
}

//pobieram wiadomość do edycji
$edit = FALSE;
if(isset($_POST['zwpc_to_edit'])) {
    $edit = $this->get_zwpc_post($_POST['zwpc_post_id']);
}

Po wysłaniu formularza z edytowaną wiadomością dzieje się to samo co przy dodawaniu z tym że jest dodatkowo przekazywany identyfikator wiadomości do edycji. Następnie z nowych rzeczy to samo się dzieje w przypadku usunięcia wiadomości z tym że tutaj jest przekazywany tylko identyfikator wiadomości do usunięcia. Ostatnią rzeczą jest wczytanie wiadomości do edycji kiedy użytkownik kliknie „Edytuj” przy wybranej wiadomości. Zmienna z załadowaną do edycji wiadomością jest wykorzystywana w formularzu.

<form method="POST">
    <?= $edit ? '<input type="hidden" name="zwpc_post_id" value="' . $edit->id . '" />' : ''; ?>
    <input type="hidden" name="zwpc_action" value="<?= $edit ? 'edit' : 'add'; ?>"/>
    <label for="post_content">Treść posta</label><br>
    <input type="text" name="post_content" value="<?= $edit ? $edit->post_content : ''; ?>"
           placeholder="Treść posta"/>
    <input type="submit" value="<?= $edit ? 'Edytuj' : 'Dodaj'; ?> post" class="button-primary"/>
</form>

W formularzu chyba nie trzeba za wiele tłumaczyć. Sprawdzamy czy jest zmienna z załadowanym postem do edycji i jeśli jest to dodajemy pole z identyfikatorem wiadomości, wczytujemy treść, zmieniamy akcję i treść przycisku formularza. Pozostaje jeszcze tabela z naszymi wpisami.

<?php
$all_posts = $this->get_zwpc_posts();
if ($all_posts) {
    echo '<table class="widefat">';
    echo '<thead>
                        <tr>
                            <th>ID</th>
                            <th>ID użytkownika</th>
                            <th>Treść wiadomości</th>
                            <th>Kiedy dodano</th>
                            <td>Akcja</td>
                        </tr>
                    </thead>';
    echo '<tfoot>
                        <tr>
                            <th>ID</th>
                            <th>ID użytkownika</th>
                            <th>Treść wiadomości</th>
                            <th>Kiedy dodano</th>
                            <th>Akcja</th>
                        </tr>
                    </tfoot>';
    echo '<tbody>';
    foreach ($all_posts as $p) {
        echo '<tr>';
        echo '<td>' . $p->id . '</td>';
        echo '<td>' . $p->user_id . '</td>';
        echo '<td>' . $p->post_content . '</td>';
        echo '<td>' . $p->create_date . '</td>';
        echo '<td><form method="POST">
                            <input type="hidden" name="zwpc_post_id" value="' . $p->id . '" />
                            <input type="submit" name="zwpc_to_edit" value="Edytuj" class="button-primary" />
                            <input type="submit" name="zwpc_delete" value="Usuń" class="button-primary error" />
                        </form></td>';
        echo '</tr>';
    }
    echo '</tbody>';
    echo '</table>';
}
?>

Najpierw pobieramy do zmiennej wszystkie wiadomości (max 100). Następnie sprawdzamy czy, w ogóle są jakiekolwiek wiadomości i jeśli są to wyświetlamy tabelę, w której w pętli wyświetlamy wszystkie rekordy. Dodatkowo w każdym rekordzie dodajemy formularz z opcjami edycji i usunięcia. Pozostają nam już tylko funkcje. Pierwszą z nich jest pobranie wiadomości do edycji.

//funkcja służąca do pobrania wiadomości o konkretnym id
//zwraca obiekt
function get_zwpc_post($id) {
    $id = esc_sql($id);
    $zwpc_post = $this->wpdb->get_results("SELECT * FROM $this->table_name WHERE id = '" . $id . "'");
    if(isset($zwpc_post[0])){
        return $zwpc_post[0];
    } else {
        return FALSE;
    }
}

Tutaj pobieramy jako parametr identyfikator wiadomości. Następnie filtrujemy ten parametr i przekazujemy do metody. Następnie sprawdzamy czy istnieje taka wiadomość i ją zwracamy lub jeśli nie istnieje to po prostu zwracamy False.

Edycja i usuwanie

//funkcja edycji wiadomości pobiera id oraz nową treść
function edit_post($id, $content){
    if(trim($content) != '' && is_user_logged_in()) {
        $id = esc_sql($id);
        $content = esc_sql($content);
        $res = $this->wpdb->update($this->table_name, array('post_content' => $content), array('id' => $id));
        return $res;
    }else {
        return FALSE;
    }
}

Funkcja edycji jest całkiem analogiczna do dodawania z tym że pobieramy jako dodatkowy paramter identyfikator wiadomości. Później sprawdzamy czy nowa treść nie jest pusta i czy użytkownik jest zalogowany. Do edycji wiadomości wykorzystujemy kolejną metodę obiektu $wpdb o nazwie update($table, $data, $where, $format = null, $where_format = null);. Metoda ta pobiera cztery parametry:

  • $table – nazwa naszej tabeli, którą chcemy edytować
  • $data – tablica z danymi, które chcemy edytować w postaci array(‚kolumna’ => ‚nowa wartość’);
  • $where – tablica warunkowa w postaci tak jak wyżej z tym że tutaj wartości muszą być równe. W naszej wtyczce sprawdzamy identyfikator wiadomości.
  • $format – opcjonalnie także tablica.
  • $where_format – jak wyżej.

Pozostaje nam jeszcze funkcja odpowiedzialna za usunięcie rekordu.

 

//funkcja odpowiedzialna za usuwanie wiadomości
function delete_post($id) {
    $id = esc_sql($id);
    if(is_user_logged_in()) {
        return $this->wpdb->delete($this->table_name, array('id' => $id));
    } else {
        return FALSE;
    }
}

Tutaj pobieramy identyfikator wiadomości, filtrujemy, sprawdzamy czy akcji dokonuje zalogowany użytkownik i
wykorzystujemy kolejną metodę obiektu $wpdb odpowiedzialnego za usuwanie danych
o nazwie delete( $table, $where, $where_format = null );, która pobiera trzy parametry:

  • $table – nazwa tabeli
  • $where – tablica warunkowa jak przy edycji
  • $where_format – opcjonalnie tak jak przy edycji

Na tym w zasadzie moglibyśmy zakończyć tę lekcję. Znamy już podstawowe operacje na bazie danych, ale pozostało nam jeszcze dodanie widgetu z naszym czatem. A taki efekt powinniśmy otrzymać w panelu administratora po dodaniu trzeciej wiadomości.

6_2

Widget z czatem

Do stworzenia naszego widgetu wykorzystamy kod z poprzedniej części piątej gdzie utworzyliśmy widget wyświetlający jedynie tekst. Teraz tworzymy taki sam zmieniając jedynie nazwę i opis. Teraz interesuje nas jedynie funkcja odpowiedzialna za wyświetlanie widgetu.

 

function widget($args, $instance){
    global $ZWP_Czat;
    echo $args['before_widget'];
    if (isset($_POST['post_content'])) {
        $ZWP_Czat->add_post($_POST['post_content']);
    }
    if (is_user_logged_in()) {
        echo '<form method="POST">
            <input type="hidden" name="zwpc_action" value="add"/>
            <label for="post_content">Treść posta</label><br>
            <input type="text" name="post_content" value="" placeholder="Treść posta"/>
            <input type="submit" value="Napisz" class="button-primary"/>
        </form>';
    }
    echo '<table>';
    $zwpc_posts = $ZWP_Czat->get_zwpc_posts();
    if ($zwpc_posts) {
        foreach ($zwpc_posts as $zwpc_p) {
            echo '<tr>';
            echo '<td>' . $zwpc_p->create_date . ' <br> ' . $zwpc_p->post_content . '</td>';
            echo '</tr>';
        }
    }
    echo '</table>';
    echo $args['after_widget'];
}

Na początek odwołujemy się do naszego obiektu czatu a następnie po wyświetleniu opakowania widgetu sprawdzamy czy został wysłany jakiś post i jeśli tak to wywołujemy funkcję odpowiedzialną za dodanie posta. Następnie sprawdzamy czy użytkownik jest aktualnie zalogowany i jeśli tak to dajemy mu możliwość napisania wiadomości na czacie. Później pobieramy wiadomości i wyświetlamy w tabeli. Poniżej otrzymany wynik.

6_36_4

Podsumowanie

I to by było na tyle. Mamy zupełnie podstawową wersję czatu. Wprawdzie czat posiada swoje podstawowe funkcjonalności ale do ukończonej wtyczki wiele mu jeszcze braku czym zajmiemy się w kolejnych częściach kursu. A poniżej tradycyjnie pełny kod pliku głównego wtyczki (nie zapominajmy o zawartości pliku uninstall.php przedstawionej wczesniej), który można pobrać ZWP_Czat

 

<?php
/**
Plugin Name: ZWP Czat
Version: 1.0
Description: ZaawansowanyWordpress Czat - prosty czat z edytowalnymi wypowiedziami
Author: Daniel Kuczewski
Author URI: http://zaawansowanywordpress.pl
Plugin URI: http://zaawansowanywordpress.pl/6-baza-danych/
 */

class ZWP_Czat {
    private $wpdb;
    private $table_name;

    function ZWP_Czat(){
        global $wpdb;
        $this->wpdb = $wpdb;
        $this->table_name = $wpdb->prefix . 'zwpc_posts';
        add_action( 'admin_menu', array( &$this, 'zwpc_add_menu' ));
    }

    function zwpc_add_menu(){
        add_menu_page( 'ZWP Czat', 'ZWP Czat', 'administrator', 'zwp-czat', array( &$this, 'zwpc_main_page'), '', 33 );
    }

    function zwpc_main_page(){
        if(isset($_POST['zwpc_action'])) {
            if($_POST['zwpc_action'] == 'add') {
                //Dodawanie wiadomości
                if($this->add_post($_POST['post_content'])) {
                    $notice = '<div class="notice notice-success">Dodano wiadomość o treści: ' . $_POST['post_content'] . '</div>';
                } else {
                    $notice = '<div class="notice notice-error">Nie dodano wiadomość o treści: ' . $_POST['post_content'] . '</div>';
                }
            } else if($_POST['zwpc_action'] == 'edit') {
                //edycja wiadomości
                if($this->edit_post($_POST['zwpc_post_id'],$_POST['post_content'])) {
                    $notice = '<div class="notice notice-success">Edytowano wiadomość o treści: ' . $_POST['post_content'] . '</div>';
                } else {
                    $notice = '<div class="notice notice-error">Nie udało się zaktualizować wiadomości o treści: ' . $_POST['post_content'] . '</div>';
                }
            }
        }

        if(isset($_POST['zwpc_delete'])) {
            //usuwanie wiadomości
            if($this->delete_post($_POST['zwpc_post_id'])) {
                $notice = '<div class="notice notice-success">Usunięto wiadomość id: ' . $_POST['zwpc_post_id'] . '</div>';
            } else {
                $notice = '<div class="notice notice-error">Nie usunięto wiadomość o id: ' . $_POST['zwpc_post_id'] . '</div>';
            }
        }

        //pobieram wiadomość do edycji
        $edit = FALSE;
        if(isset($_POST['zwpc_to_edit'])) {
            $edit = $this->get_zwpc_post($_POST['zwpc_post_id']);
        }

        ?>
        <div class="warp">
            <h2><span class="dashicons dashicons-admin-comments"></span>ZWP Czat</h2>
            <?= isset($notice) ? $notice : ''; ?>
            <form method="POST">
                <?= $edit ? '<input type="hidden" name="zwpc_post_id" value="' . $edit->id . '" />' : ''; ?>
                <input type="hidden" name="zwpc_action" value="<?= $edit ? 'edit' : 'add'; ?>"/>
                <label for="post_content">Treść posta</label><br>
                <input type="text" name="post_content" value="<?= $edit ? $edit->post_content : ''; ?>"
                       placeholder="Treść posta"/>
                <input type="submit" value="<?= $edit ? 'Edytuj' : 'Dodaj'; ?> post" class="button-primary"/>
            </form>
            <?php
            $all_posts = $this->get_zwpc_posts();
            if ($all_posts) {
                echo '<table class="widefat">';
                echo '<thead>
                                    <tr>
                                        <th>ID</th>
                                        <th>ID użytkownika</th>
                                        <th>Treść wiadomości</th>
                                        <th>Kiedy dodano</th>
                                        <td>Akcja</td>
                                    </tr>
                                </thead>';
                echo '<tfoot>
                                    <tr>
                                        <th>ID</th>
                                        <th>ID użytkownika</th>
                                        <th>Treść wiadomości</th>
                                        <th>Kiedy dodano</th>
                                        <th>Akcja</th>
                                    </tr>
                                </tfoot>';
                echo '<tbody>';
                foreach ($all_posts as $p) {
                    echo '<tr>';
                    echo '<td>' . $p->id . '</td>';
                    echo '<td>' . $p->user_id . '</td>';
                    echo '<td>' . $p->post_content . '</td>';
                    echo '<td>' . $p->create_date . '</td>';
                    echo '<td><form method="POST">
                                        <input type="hidden" name="zwpc_post_id" value="' . $p->id . '" />
                                        <input type="submit" name="zwpc_to_edit" value="Edytuj" class="button-primary" />
                                        <input type="submit" name="zwpc_delete" value="Usuń" class="button-primary error" />
                                    </form></td>';
                    echo '</tr>';
                }
                echo '</tbody>';
                echo '</table>';
            }
            ?>
            </div>
        <?php
    }

    function add_post($post_content) {
        //sprawdzam czy nie pusty i czy jest zalogowany
        if(trim($post_content) != '' && is_user_logged_in()){
            $user_id = get_current_user_id();
            $post_content = esc_sql($post_content);
            $this->wpdb->insert( $this->table_name, array('user_id' => $user_id, 'post_content' => $post_content) );
            return TRUE;
        }
        return FALSE;
    }

    function get_zwpc_posts() {
        return $this->wpdb->get_results("SELECT * FROM $this->table_name ORDER BY create_date DESC LIMIT 0,100");
    }

    //funkcja służąca do pobrania wiadomości o konkretnym id
    //zwraca obiekt
    function get_zwpc_post($id) {
        $id = esc_sql($id);
        $zwpc_post = $this->wpdb->get_results("SELECT * FROM $this->table_name WHERE id = '" . $id . "'");
        if(isset($zwpc_post[0])){
            return $zwpc_post[0];
        } else {
            return FALSE;
        }
    }

    //funkcja edycji wiadomości pobiera id oraz nową treść
    function edit_post($id, $content){
        if(trim($content) != '' && is_user_logged_in()) {
            $id = esc_sql($id);
            $content = esc_sql($content);
            $res = $this->wpdb->update($this->table_name, array('post_content' => $content), array('id' => $id));
            return $res;
        }else {
            return FALSE;
        }
    }

    //funkcja odpowiedzialna za usuwanie wiadomości
    function delete_post($id) {
        $id = esc_sql($id);
        if(is_user_logged_in()) {
            return $this->wpdb->delete($this->table_name, array('id' => $id));
        } else {
            return FALSE;
        }
    }
}
$ZWP_Czat = new ZWP_Czat();

add_action( 'widgets_init', 'zwpc_register_widget' );

function zwpc_register_widget() {
    register_widget( 'ZWPC_Widget');
}

class ZWPC_Widget extends WP_Widget {
    function ZWPC_Widget() {
        // tablica opcji.
        $widget_ops = array(
            'classname' => 'ZWPC_Widget', //nazwa klasy widgetu
            'description' => 'ZWP Czat', //opis widoczny w panelu
        );
        //ładowanie
        parent::__construct( 'ZWPC_Widget', 'ZWP Czat', $widget_ops );
    }
    function form($instance) {
        ?>
        <p>
            Widget wyświetla czat.
        </p>
        <?php
    }
    function update($new_instance, $old_instance) {
        return $old_instance;
    }

    function widget($args, $instance){
        global $ZWP_Czat;
        echo $args['before_widget'];
        if (isset($_POST['post_content'])) {
            $ZWP_Czat->add_post($_POST['post_content']);
        }
        if (is_user_logged_in()) {
            echo '<form method="POST">
                <input type="hidden" name="zwpc_action" value="add"/>
                <label for="post_content">Treść posta</label><br>
                <input type="text" name="post_content" value="" placeholder="Treść posta"/>
                <input type="submit" value="Napisz" class="button-primary"/>
            </form>';
        }
        echo '<table>';
        $zwpc_posts = $ZWP_Czat->get_zwpc_posts();
        if ($zwpc_posts) {
            foreach ($zwpc_posts as $zwpc_p) {
                echo '<tr>';
                echo '<td>' . $zwpc_p->create_date . ' <br> ' . $zwpc_p->post_content . '</td>';
                echo '</tr>';
            }
        }
        echo '</table>';
        echo $args['after_widget'];
    }

}


register_activation_hook(__FILE__, 'zwpc_activation');

function zwpc_activation() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'zwpc_posts';

    if ($wpdb->get_var("SHOW TABLES LIKE '" . $table_name . "'") != $table_name) {
        $query = "CREATE TABLE " . $table_name . " (
        id int(9) NOT NULL AUTO_INCREMENT,
        user_id MEDIUMINT(6) NOT NULL,
        post_content TEXT NOT NULL,
        create_date TIMESTAMP NOT NULL,
        PRIMARY KEY  (id)
        )";

        $wpdb->query($query);
    }
}

 


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *