Skrip Inisialisasi untuk Aspek “Standar” dari Situs Web WordPress?


23

Saya akan harus menulis skrip untuk menginstal WordPress 3.0.1 yang baru dan menambahkan semua fitur awal untuk sebuah situs web . Ini untuk perusahaan yang memasang banyak situs web serupa dan mereka membutuhkan titik awal standar dalam konfigurasi dan data.

  • Saya ingin tahu apakah ada orang lain yang telah melakukan ini dan jika demikian apakah mereka dapat membagikan kode mereka?

Saya membayangkan kita akan mengubah skrip ini setiap kali mereka membuat situs baru sehingga hard-coding baik-baik saja walaupun pada akhirnya (setelah pengalaman yang cukup) saya ingin mengonversinya menjadi plugin.

Inilah daftar tugas-tugas dasar yang saya pikir akan perlu (anggap saya sudah mulai dengan WordPress 3.0.1 yang sudah diinstal dan plugin kustom dan tema khusus saya disalin ke direktori yang sesuai) :

// Create users for the current site
// Delete Hello Dolly Plugin
// Download, Install and Activate repository plugins
// Activate Custom Plugins (assume the plugins are already there)
// Activate Custom Theme
// Delete Hello Post
// Delete Comment on Hello Post
// Create Pages with Starter Content
// Create Initial Custom Post Types with Starter Content
// Create Multiple Menus 
// Create Menu Items for those Menus linking to Pages and wp-login.php
// Create Initial Taxonomy Terms
// Set Desired Permalinks Setting
// Set Static Front Page Setting

Itu saja (meskipun saya dapat mengidentifikasi lebih banyak ketika saya masuk ke dalamnya.)

Sekali lagi, saya mencari kode yang hanya bisa saya salin dan modifikasi sehingga saya tidak perlu sendiri mencari tahu semua detail ini (yang tidak sulit, hanya membosankan dan memakan waktu) .

Oh satu hal lagi, saya harus memulainya sekarang jadi semakin cepat semakin baik! :-)


Bisakah Anda memperjelas ini Create Menus for Custom Pages? Apakah maksud Anda area menu individual pada beberapa halaman atau apa?
Rarst

Hai @ Pertama : Saya perlu membuat tiga menuseach dengan item menu yang menautkan ke Halaman Kustom yang akan saya tambahkan (penggunaan "Kustom" saya mungkin membingungkan, saya akan menjatuhkan kata itu dan hanya mengatakan "Halaman." ) Jadi Saya perlu menambahkan tiga menu dan item menu untuk masing-masing di mana salah satu item menu perlu ditautkan ke halaman login.
MikeSchinkel

Mengapa menghapus plugin "Hello Dolly"? Maksud saya, saya mengerti mengapa Anda tidak menginginkannya di sana, tetapi keberadaannya tidak memengaruhi pengoperasian situs, dan jika Anda menggunakan fungsi peningkatan otomatis, itu akan dipulihkan setiap kali versi baru dirilis.
Doug

2
Hi @Doug : Mengapa menghapus Hello Dolly? Jawaban sederhana: Klien tidak menginginkannya di sana. :)
MikeSchinkel

Jawaban:


20

Seperti yang saya sebutkan saya akan segera mulai mengerjakan kebutuhan ini jadi saya membuat kemajuan. Mengingat bahwa saya merobohkan ini, saya pikir yang terbaik adalah mulai mempostingnya. Namun, jika orang lain dapat / akan memposting (sebagian) bagian yang belum saya lakukan, saya akan dengan senang hati membiarkan Anda menyalin apa pun yang telah saya lakukan dan belum memilih jawaban Anda sebagai jawaban terbaik. Sampai saat itu saya akan mulai memposting kode.

Hal Pertama: Sertakan wp-load.php:

Karena kami membuat file mandiri di root situs web untuk menjalankan inisialisasi yang hanya akan digunakan untuk "bootstrap" sebuah situs (saya namakan milik saya /my-init.php), kami mulai dengan memasukkan /wp-load.phpuntuk memuat fungsi WordPress API:

<?php
include "wp-load.php";

Menciptakan Pengguna untuk Situs

Kami akan menggunakan wp_insert_user()fungsi yang terletak di /wp-includes/registration.phpuntuk membuat pengguna kami. File ini tidak dimuat secara default sehingga kami harus memuatnya sendiri dengan panggilan ke require_once().

Kami juga akan menggunakan get_user_by()fungsi untuk melihat terlebih dahulu apakah pengguna telah dibuat; tidak perlu menjalankan kode dua kali jika belum. CATATAN: Ini adalah pola yang akan mengikuti; misalnya skrip kami tidak boleh menggandakan atau menimpa apa pun jika dipanggil beberapa kali, terutama setelah pengguna menambahkan atau mengubah data untuk salah satu item yang kami rencanakan untuk diinisialisasi.

require_once( ABSPATH . WPINC . '/registration.php');     
$user = get_user_by('slug','johnsmith');
if (!is_object($user)) {
  wp_insert_user(array(
    'user_login'        => 'johnsmith',
    'role'              => 'administrator',
    'user_email'        => 'johnsmith@example.com',
    'user_url'          => 'http://example.com',
    'first_name'        => 'John',
    'last_name'         => 'Smith',
    'comment_shortcuts' => '',
    'use_ssl'           => '0',
    'user_pass'         => '12345',
  ));
}

Menghapus Plugin "Hello Dolly"

Untuk menghapus plugin "Hello Dolly" ( maaf Matt ), kami akan menggunakan delete_plugins()fungsinya. delete_plugins()mengharapkan array jalur file yang relatif terhadap /wp-content/includes/direktori. Untuk plugin Hello Dolly path file hanya hello.phpkarena plugin Hello Dolly tidak disimpan dalam direktori itu sendiri tetapi untuk sebagian besar plugin itu akan dalam bentuk {$subdir}\{$filename}.php; yaitu path file untuk Akismet adalah akismet/akismet.php.

Namun, delete_plugins()tidak tersedia sampai kami sudah memasukkan /wp-admin/includes/plugin.phpdan ada juga ketergantungan dengan wp-admin/includes/file.phpjadi kami require_once()berdua sebelum menelepon delete_plugins(). Akhirnya kami menggunakan WP_PLUGIN_DIRkonstan dikombinasikan dengan file_exists()untuk melihat apakah file plugin utama ada sebelum kami mencoba untuk menghapusnya (tidak masalah jika kami mencoba untuk menghapus file yang hilang, tetapi lebih elegan untuk benar-benar memeriksa dulu dan Anda mungkin perlu tahu caranya untuk beberapa alasan lain) :

require_once(ABSPATH . 'wp-admin/includes/plugin.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
if (file_exists(WP_PLUGIN_DIR . '/hello.php'))
  delete_plugins(array('hello.php'));

Perhatikan bahwa kadang-kadang delete_plugins()akan gagal karena izin file atau mungkin fakta plugin saat ini diaktifkan atau alasan lain bahwa Anda harus terlebih dahulu menyelesaikannya tetapi untuk kasus penggunaan kami Hello Dolly hilang tanpa perlawanan.

Mengunduh, Menginstal, dan Mengaktifkan Plugin Repositori

Saya sebenarnya tidak perlu mengunduh plugin dari repositori sekarang (saya pikir itu akan menyenangkan untuk dimiliki) kita akan membiarkan persyaratan ini meluncur dan mengunjungi kembali nanti.

Mengaktifkan Plugin Anda

Selanjutnya adalah mengaktifkan plugin kustom kami sendiri. Kami berasumsi bahwa kami telah mengunggahnya ke direktori plugin dan yang perlu kita lakukan adalah mengaktifkannya untuk WordPress. ( Catatan : Teknik ini juga akan berfungsi untuk mengaktifkan plugin repositori, itu tidak akan mengunduh dan menginstalnya terlebih dahulu.)

Kami akan menggunakan activate_plugin()fungsi yang suka delete_plugins()menuntut /wp-admin/includes/plugin.phpuntuk dimasukkan tapi tidak perlu /wp-admin/includes/file.phpdalam kasus Anda hanya perlu untuk mengotomatisasi aktivasi dan tidak penghapusan.

Kami akan lagi menguji keberadaan (tidak perlu mengaktifkan jika tidak ada, eh?) Dan kami juga akan memverifikasi menggunakan is_plugin_active()fungsi bahwa plugin belum diaktifkan. Catatan saya menggunakan beberapa variabel kali ini ( $plugin_filepathdan $plugin_dir) agar tidak menduplikasi pengidentifikasi plugin berkali-kali.

Contoh kami berikut ini mengaktifkan plugin my-custom-plugin.phpyang terletak di my-custom-pluginsubdirektori:

require_once(ABSPATH . 'wp-admin/includes/plugin.php');
$plugin_filepath = 'my-custom-plugin/my-custom-plugin.php';
$plugin_dir = WP_PLUGIN_DIR . "/{$plugin_filepath}";
if (file_exists($plugin_dir) && !is_plugin_active($plugin_filepath))
  activate_plugin($plugin_filepath);

Mengaktifkan Tema Pilihan Anda

Mengaktifkan tema sedikit lebih mudah daripada menghapus atau mengaktifkan plugin, secara relatif; salah satu fungsi panggilan adalah semua yang diperlukan: switch_theme(). The switch_theme()Fungsi menerima dua (2) parameter: Template dan stylesheet . Yah, setidaknya itulah yang dinamai parameter. Anda mungkin lebih akrab dengan istilah Tema Orang Tua dan Tema Anak .

Dengan asumsi Anda telah membuat Tema Anak dengan tema TwentyTen default yang datang dengan WordPress menjadi Tema Induk dan Anda menyebutnya "Tema Kustom Saya" dan meletakkannya di /wp-content/themes/my-custom-themedirektori, Anda akan mengaktifkan tema Anda menggunakan panggilan ini:

switch_theme('twentyten', 'my-custom-theme');

Tetapi bagaimana jika itu bukan tema anak? Itu mudah, cukup lewati direktori slug / pengenal tema (yaitu nama subdirektori /wp-content/themesyang mengandung tema Anda) sebagai kedua parameter. Dengan asumsi Anda ingin mengaktifkan tema Tematik oleh Ian D Stewart Anda telah memanggil switch_theme()seperti ini:

switch_theme('thematic', 'thematic');

Secara pribadi saya pikir itu agak aneh untuk harus melacak kedua detail di sini jadi saya menulis fungsi yang disebut activate_my_theme()cek pertama untuk memastikan get_current_theme()fungsi dan jika tidak mengaktifkannya. Anda hanya perlu memberi tahu itu tema anak (alias "stylesheet") dan mencari tahu tema induk untuk Anda (alias "templat") dengan mengambil detail dari get_theme()fungsi.

activate_my_theme('My Current Theme');
function activate_my_theme($theme_name) {
  if ($theme_name!=get_current_theme()) {
    $theme = get_theme($theme_name);
    switch_theme(
      $theme['Template'],
      $theme['Stylesheet']
    );
  }
}

Satu hal penting yang harus diperhatikan ; yang get_theme()mengharapkan fungsi yang akan lulus nama dari Tema Anak, TIDAK direktori itu slug / tema identifier. (Nama ini berasal dari bagian "Nama Tema:" di header style.cssfile tema . Untungnya get_current_theme()fungsi mengembalikan nama juga.)

Memeriksa header di style.cssfile tema default WordPress Twenty Ten yang kita lihat namanya sebenarnya 'Twenty Ten':

/*
Theme Name: Twenty Ten
Theme URI: http://wordpress.org/
Description: The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the "Asides" and "Gallery" categories, and has an optional one-column page template that removes the sidebar.
Author: the WordPress team
Version: 1.1
Tags: black, blue, white, two-columns, fixed-width, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style
*/

Menghapus Posting "Hello World"

Selanjutnya kita ingin menghapus posting "Hello World" . Anda mungkin telah melihat bahwa @Rarst telah menunjukkan kepada kita bagaimana menggunakan wp_delete_post()fungsi yang memang kita butuhkan. Saat ia menjelaskan parameter kedua akan sepenuhnya menghapus pos sebagai kebalikan dari memindahkannya ke tempat sampah dan parameter pertama adalah $post->ID.

Tentu saja akan menyenangkan untuk dapat menentukan siput bukan $post->IDdan jadi saya memutuskan untuk menemukan cara untuk melakukan itu. Setelah beberapa spelunking saya menemukan bahwa WordPress memiliki fungsi bernama sayangnya get_page_by_path()yang disebut yang sebenarnya memungkinkan kita untuk mencari semua jenis posting dengan siputnya (itu sayangnya dinamai karena Anda mungkin mengabaikannya ketika mencoba menemukan sesuatu yang berfungsi dengan jenis posting selain 'page'.)

Sejak kita lewat get_page_by_path() konstanta yang didefinisikan oleh WordPress, OBJECTmaka akan kembali kepada kita sebuah tulisan dalam bentuk objek posting. Untuk parameter ketiga yang kami lewati 'post'menunjukkan bahwa kami ingin mencari jenis posting 'post'. Karena get_page_by_path()akan mengembalikan objek posting yang kita butuhkan atau kembali nulljika tidak ada posting yang sesuai dengan siput kita dapat memeriksa keberadaannya dan melakukan pencarian pada saat yang sama:

$post = get_page_by_path('hello-world',OBJECT,'post');
if ($post)
  wp_delete_post($post->ID,true);

Catatan: Kami dapat menjalankan kode untuk menghapus setiap posting di basis data tetapi jika kami melakukannya, kami tidak akan dapat menjalankan kode ini lagi setelah kami menambahkan posting yang ingin kami simpan dan itu adalah salah satu kendala desain kami.

Berikutnya...

Saya akan terus menambahkan ini ketika saya mencari tahu sampai saya selesai atau sampai orang lain membantu.


Ini sangat membantu, apakah ada kemungkinan untuk memasukkan sisa fungsi di sini?
Juli

@jjeaton - Jawaban singkat: Ya, tapi ... . Jawaban yang lebih panjang: Ini akan menjadi beberapa hari jika tidak berminggu-minggu. Saya telah melakukan pekerjaan yang signifikan pada masalah ini sejak saya terakhir menulis di sini tetapi klien saya mendorong untuk menyelesaikan proyek dan saya di belakang, jadi ... jika Anda bisa menunggu sebentar, saya akan mempostingnya sesegera mungkin. dapatkan waktu luang untuk menuliskannya. BTW, aspek apa yang paling menarik bagi Anda?
MikeSchinkel

tentu saja, tidak terburu-buru sama sekali. Saya berpikir pertanyaan ini akan sangat berharga dan ingin melihat seluruh solusi. Saya menjalankan beberapa situs WordPress, dan saya selalu mencari cara untuk mengotomatiskan pemeliharaan berulang yang harus saya lakukan pada mereka (pembaruan plugin, peningkatan, dll.) Sehingga beberapa di antaranya sangat berharga.
Juli

4

Tetapkan Permalinks yang Diinginkan

Sebuah proyek tema baru (luar biasa) yang saya temui minggu ini yang sangat berfokus pada fungsionalitas HTML5 / CSS3 memiliki skrip 'bootstrap' sendiri untuk membuat beberapa konten boilerplate, menggabungkan pengaturan permalink, mengatur root relatif untuk instalasi situs, dll. Ini fitur dipanggil pada aktivasi tema. Proyek ini disebut Roots dan kode dapat diunduh di sini ; Saya tidak mengambil kredit untuk kode ini. Yang mengatakan, inilah kode untuk auto-set / year / postname sebagai struktur permalink (dan kait aktivasi di bawah ini untuk global $ pagenow dijelaskan di sini: http://foolswisdom.com/wp-activate-theme-actio/ .) .

<?php

    global $pagenow;
    if (is_admin() && 'themes.php' === $pagenow && isset( $_GET['activated'])) {


        // set the permalink structure
        if (get_option('permalink_structure') != '/%year%/%postname%/') { 
            update_option('permalink_structure', '/%year%/%postname%/');
      }

        $wp_rewrite->init();
        $wp_rewrite->flush_rules(); 


    }

?>


Oh, ada rencana untuk terus mengerjakan pertanyaan ini ... Tapi karena banyak rencana lain yang ditunda. :) Saya ingin mencatat bahwa lebih baik menautkan ke cuplikan kode pihak ketiga yang tidak mendidik, daripada mengirim tema di sini. Situs ini memberikan kontribusi pengguna di bawah lisensi cc-wiki sehingga situasinya menjadi suram dan bingung ketika diterapkan pada kode.
Paling lambat

Pasti, pasti. Namun, ada kemajuan luar biasa di sini. Itu panggilan yang bagus untuk saran Anda, saya sudah sekitar satu atau dua blok Stack Exchange tetapi tidak pernah memikirkan implikasi lisensi. Saya mengedit kode saya dan sisa kode tersebut dengan mudah diperoleh di tautan yang saya berikan. Terima kasih atas tipnya :)

3

Hapus Hello Post (dengan komentar)

wp_delete_post( 1, true );

Langsung dari wp_delete_post()dokumen. Parameter kedua nukes sepenuhnya, alih-alih pindah ke tempat sampah.

Buat menu

Ini menciptakan menu baru dan menambahkan semua halaman yang ada sebagai item ke dalamnya. Saya tidak yakin itu sepenuhnya benar, saya tidak bisa mendapatkan item menu untuk menunjukkan Pagelabel antara lain. Pokoknya otak saya meleleh jadi saya istirahat. Mungkin seseorang akan dapat meningkatkan ini ke sesuatu yang lebih dapat diandalkan.

$menu = wp_create_nav_menu( 'Pages' );
$menu = wp_get_nav_menu_object( 'Pages' );
$pages = get_pages();

foreach( $pages as $page ) {

$item = array(
'menu-item-db-id' => 0,
'menu-item-object-id' => $page->ID,
'menu-item-type' => 'post_type',
'menu-item-status' => 'publish'
);

wp_update_nav_menu_item( $menu->term_id, 0, $item );
}

Hai @Rarst : Terima kasih telah berkomentar. Ah, kamu mengambil yang mudah ... ;-) Aku baru saja kembali untuk menulis yang itu.
MikeSchinkel

@MikeSchinkel Apa pun yang tidak Anda tulis sekarang? Akan sia-sia untuk menyelam ke dalam kode menu (ini menakutkan) untuk datang dengan hasil dan menemukan itu sudah dilakukan. :)
Rarst

Hai @ Pertama! Mulai di akhir daftar? (terima kasih sebelumnya.)
MikeSchinkel

Oke, saya akan mencoba menangani Menu, tetapi tidak ada janji. Kode itu rumit di dalam (harga permen mata dan kegunaan), jadi saya tidak yakin keterampilan saya siap untuk itu.
Jarang

Hey @Rarst - Saya sudah cukup banyak membuatnya bekerja tetapi mungkin akan ada 24 jam atau lebih sebelum saya bisa menyelesaikan jawaban saya. Hanya ingin memberi tahu Anda agar Anda tidak bunuh diri saat mencoba membuatnya bekerja. Terima kasih atas usahanya.
MikeSchinkel

0

Jika saya memahaminya dengan baik, Anda menginginkannya untuk instalasi awal - maka saya khawatir pendekatan Anda benar-benar salah.

Jauh lebih baik, lebih mudah dan cara terstandarisasi adalah membuat install.php dan meletakkannya di folder konten-wp - itu secara otomatis dimuat selama instalasi.

Di sana Anda dapat meletakkan fungsi wp_install Anda sendiri (seperti fungsi wordpress sendiri menggunakan if (! Function_exist)) sehingga Anda dapat dengan mudah mengatur opsi Anda, mengaktifkan plugin, mengisi posting awal, kategori, tag, pengguna ...

Opsi kedua mungkin untuk situasi, di mana Anda ingin menghapus wp yang sudah ada (misalnya untuk versi demo disetel setiap mis 30 menit menggunakan cron) - Anda dapat a) memotong basis data dan menggunakan prosedur di atas, atau membuat plugin yang melakukan sama.


2
@ Thomas Kapler - Terima kasih atas jawaban Anda tapi saya mohon berbeda; pendekatan saya tidak "sepenuhnya salah." Pertama, apa yang saya diskusikan adalah kode yang sama yang akan Anda gunakan install.php, dan kedua ada kasus penggunaan lain di mana install.phptidak berlaku. Ya, install.phpsudah digunakan tetapi itu tidak mengurus detailnya juga tidak untuk obat mujarab yang Anda maksudkan.
MikeSchinkel

0

Lihatlah skrip instalasi ini. https://github.com/Pravdomil/WP-Quick-Install

Saya mengambil ide-ide Anda dan beberapa kode dan menciptakan sesuatu yang mungkin Anda cari.

Fitur-fiturnya adalah pengaturan basis data, berbagai bahasa, buat pengguna, setel pengaturan situs dasar, hapus plugin dan templat default, unduh instal dan aktifkan plugin dan tema, avatar default, permalinks, halaman depan statis.

Jatuh bebas untuk berkontribusi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.