Beberapa waktu yang lalu, saya diminta untuk membuat sebuah file berekstensi .xml yang dibangkitkan dari sebuah web yang dibangun dengan CMS WordPress. Seperti yang sudah diketahui, XML adalah format file layanan web (web service) yang bisa dimanfaatkan untuk penyedia layanan untuk berbagai macam aplikasi. Dulu sekali saya pernah membuat tutorial Membuat Dokumen XML dengan PHP dan MySQL.

Awalnya ‘tantangan’ tersebut bakal bisa diselesaikan dengan plugin WordPress. Namun, setelah dipikir-pikir, sepertinya justru akan menyulitkan. Struktur XML yang diminta sudah punya standar yang baku, sehingga harus dimodifikasi sendiri tanpa bantuan plugin. Setelah mencari beberapa referensi, akhirnya saya coba untuk mengulik lebih jauh tutorial di halaman ini.

Secara struktur, WordPress sendiri sudah menyimpan seluruh kontennya ke dalam sebuah database yang rapi. Untuk mengambil konten-konten tersebut, sudah tidak perlu lagi menggunakan perintah query PHP. Akan tetapi, cukup dengan memanggil fungsi-fungsi bawaan WordPress. Maka untuk mengambil konten-konten tersebut, hal yang perlu dilakukan pertama kali adalah memilih dan memilah konten mana saja yang ingin ditampilkan ke dalam XML.

Ide dasar untuk membangkitkan file tersebut yaitu dengan memanfaatkan fungsi (function) WordPress yang nantinya akan memerlukan variabel-variabel tertentu untuk dituliskan ke dalam file .xml tersebut. Untuk mencari tahu detail-detail fungsi dasar apa saja yang bisa dipakai, bisa merujuk pada Code Reference yang sudah disediakan WordPress.

Jika dituliskan tahapan-tahapannya, maka algoritma fungsi tersebut sbb:

  • Buat sebuah file .xml kosong setiap kali user menyimpan (save) atau menayangkan (publish) konten lewat dasbor WordPress
  • Isikan file .xml tersebut dengan format dasar struktur XML
  • Tambahkan beberapa baris kode yang berisi variabel-variabel bawaan WordPress ke dalam file tersebut, sesuai dengan konten mana saja yang ingin ditampilkan dalam feed XML
  • Simpan file tersebut dan ulangi lagi langkah nomor 1

Dari tahapan-tahapan yang disebutkan di atas, maka kita bisa mulai menuliskan script fungsi tersebut dengan menambahkan fungsi baru di dalam functions.php. File tersebut terletak dalam folder theme/template WordPress (biasanya ada di wp-content/theme/nama-theme).

Pada tutorial kali ini, struktur artikel file XML yang akan ditampilkan meliputi ID, judul, kategori, tanggal tayang, URL artikel, URL featured image, isi artikel, nama penulis, dan source URL. Output dari fungsi ini nantinya akan terdiri dari delapan artikel terakhir yang dipublish melalui web kita. Setiap kali ada artikel baru, maka XML tersebut juga akan membangkitkan feed dari artikel baru tersebut.


Kira-kira output tampilan XML tersebut menjadi seperti screenshoot di bawah ini.

File XML di atas merupakan tampilan dari file sitemapku.xml. Jadi, file tersebut nantinya secara otomatis akan dibangkitkan melalui fungsi bernama eg_create_sitemap(). File tersebut akan berada di dalam folder root domain.

/* Fungsi untuk membuat sitemap.xml */

/* Aksi untuk membangkitkan sitemap.xml setiap kali publish post */
add_action("publish_post", "eg_create_sitemap");

/* Aksi untuk membangkitkan sitemap.xml setiap kali menyimpan/save post */
// add_action( "save_post", "eg_create_sitemap" );

/* Fungsi utama*/
function eg_create_sitemap() {
    // Jumlah postingan yang ingin ditampilkan dalam feed
    $postCount = 8; 
    $posts = query_posts('post_status=publish', 'showposts='.$postCount);
    
    // Header file XML
    $sitemap .= '<?xml version="1.0" encoding="UTF-8"?>';

    // Isi file XML
    $sitemap .= '<articles>';
    $sitemap .= "\t" . '<UUID>123456789</UUID>' .
        "\t\t" . '<time>1457280000000</time>' . "\n";
    
    // Kondisi untuk menampilkan feed tiap artikel berdasarkan ID-nya
    while(have_posts()) : the_post();
        // Mendapatkan kategori artikel
        $categories = get_the_category();
        // Mendapatkan konten/isi artikel
        $konten = get_the_content(); 
        // Menampilkan data XML untuk tiap artikel
        $sitemap .= "\t" . '<article>' . "\n" .
            "\t\t" . '<ID>' . get_the_ID() . '</ID>' .
            "\n\t\t" . '<title>' . get_the_title() . '</title>' .
            "\n\t\t" . '<category>' . $categories[0]->name . '</category>' .
            "\n\t\t" . '<publishTimeUnix>' . get_post_timestamp() . '</publishTimeUnix>' .
            "\n\t\t" . '<thumbnail>' . wp_get_attachment_url( get_post_thumbnail_id()) . '</thumbnail>' .
            "\n\t\t" . '<contents><image><url>' . wp_get_attachment_url( get_post_thumbnail_id()) . '</url></image><text><content><![CDATA[' . wpautop($konten) . ']]></content></text></contents>' .
            "\n\t\t" . '<author>' . get_the_author() . '</author>' .
            "\n\t\t" . '<sourceURL>' . get_permalink().'?utm_source=line&amp;utm_medium=aggregator'. '</sourceURL>';

        $sitemap .= "\n\t" . '</article>' . "\n";
    endwhile;
    $sitemap .= '</articles>';

    // Membuat file baru sekaligus menimpa file lama bernama sitemapku.xml
    $fp = fopen( ABSPATH . "sitemapku.xml", 'w' );
    fwrite( $fp, $sitemap );
    fclose( $fp );
}

Di bagian awal script, ada dua aksi atau trigger yang bisa dipilih. Bila menginginkan file .xml tersebut dibangkitkan setiap kali mem-publish konten, maka bisa gunakan aksi berikut:

add_action("publish_page", "eg_create_sitemap");

Namun, bila menginginkan file .xml tersebut dibangkitkan setiap kali save atau menyimpan konten, maka bisa gunakan aksi berikut:

add_action( "save_post", "eg_create_sitemap" );

Lalu, apa sebenarnya manfaat nyata dari file .xml ini? Salah satu manfaat dari file .xml ini adalah menyediakan layanan yang bisa diakses oleh aplikasi atau web apps lain. Misalnya, suatu saat ada aplikasi news aggregator yang ingin mengambil sebagian konten yang ada di dalam web kita dengan parameter-parameter yang sudah ditentukan, maka kita bisa memodifikasi fungsi ini. Isi dari konten tersebut bisa di-filter sesuai dengan kebutuhan.

Semoga bermanfaat.

Komentar
Unlimited Hosting WordPress Developer Persona

You can subscribe to my newsletter to get updates (no spam).

powered by TinyLetter