WordPress Web Sitesinin “Standart” Yönleri için Başlatma Komut Dosyası?


23

WordPress 3.0.1'in yeni kurulumunu yapmak ve bir web sitesinin tüm ilk özelliklerini eklemek için bir komut dosyası yazmak zorundayım . Bu, çok sayıda benzer web sitesi yükleyen bir şirket içindir ve yapılandırma ve verilerde standart bir başlangıç ​​noktasına ihtiyaçları vardır.

  • Bunu daha önce başkasının yapıp yapmadığını ve eğer öyleyse kodlarını paylaşabilir mi diye merak ediyorum.

Her seferinde yeni bir site oluşturduklarında bu senaryoyu ince ayarlayacağımızı düşünüyorum, bu nedenle kodlamanın doğru olmasına rağmen (yeterli deneyimin ardından) bir eklentiye dönüştürmek istiyorum.

İhtiyacımız olacağını düşündüğüm görevlerin temel listesi: (bunlar önceden yüklenmiş WordPress 3.0.1 ile başladığımı ve özel eklentilerimin ve özel temamın uygun dizinlere kopyalandığını varsayalım) :

// 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

Bu onunla ilgili (içine girdiğimde daha fazla tanımlayabilsem de)

Yine, sadece kopyalayıp değiştirebileceğim bir kod arıyorum, böylece tüm bu ayrıntıları kendim çözmek zorunda kalmayacağım (zor değil, sadece sıkıcı ve zaman alıcı) .

Bir şeyi daha Ah, bu konuda başlamak zorunda şimdi daha iyi er so! :-)


Bunu açıklığa kavuşturur Create Menus for Custom Pagesmusun? Bazı sayfalardaki münferit menü alanlarını mı kastediyorsunuz?
Rarst

Merhaba @Rarst : Ekleyeceğim Özel Sayfalara bağlantı veren menü öğeleriyle birlikte üç menü oluşturmam gerekiyor ( "Özel" i kullanmam muhtemelen kafa karıştırıcı, bu kelimeyi bırakıp sadece "Sayfalar" diyeceğim ) Menü öğelerinin birinin giriş sayfasına bağlanması gereken her yere üç menü ve menü öğesi eklemem gerekiyor.
MikeSchinkel

Neden "Hello Dolly" eklentisini sil? Yani, neden orada istemediğinizi anlıyorum, ancak varlığı sitenin çalışmasını etkilemiyor ve otomatik yükseltme işlevini kullanırsanız, her yeni sürüm yayımlandığında geri yüklenir.
Doug

2
Merhaba @Doug : Neden Hello Dolly'yi silelim ? Basit cevap: Müşteri orada istemiyor. :)
MikeSchinkel 14:10

Yanıtlar:


20

Bahsettiğim gibi , bu ihtiyaç üzerinde hemen çalışmaya başlayacağım, bu yüzden yoluma gidiyorum. Bunları yıktığım için onları göndermeye başlamanın en iyisi olduğunu düşündüm. Yine de, başkası yapmadığım parçaları yayınlayabiliyorsa (bazılarını) yayınlayabiliyorsa / gönderirse / gönderirseniz, yapacağım her şeyi kopyalamanıza izin vermekten memnuniyet duyarım ve cevabınızı en iyi cevap olarak seçin. O zamana kadar kodu göndermeye başlayacağım.

İlk Şey: Dahil Et wp-load.php:

Web sitemizin kökünde bağımsız bir dosya oluşturduğumuzdan, başlatmayı çalıştırmak için yalnızca bir siteyi "önyüklemek" için kullanılacak (benim/my-init.php adımı verdim )/wp-load.php , WordPress API işlevlerini yüklemek için ekleyerek başlıyoruz :

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

Site İçin Kullanıcı Oluşturma

Kullanıcılarımızı oluşturmak için wp_insert_user()bulunan işlevi kullanacağız /wp-includes/registration.php. Bu dosya varsayılan olarak yüklenmedi, bu yüzden bir çağrı ile kendimizi yüklememiz gerekecek require_once().

get_user_by()Fonksiyonu, daha önce kullanıcının oluşturulduğunu görmek için de kullanırız ; Gerekmediyse kodu iki kez çalıştırmanıza gerek yoktur. Not: Bu bir kalıp izleyecektir; Örneğin, betiğimiz, özellikle kullanıcılar başlatmayı planladığımız öğelerden herhangi birine veri ekledikten veya değiştirdikten sonra, birden çok kez çağrıldığında hiçbir şeyi çoğaltmamalı veya üzerine yazmamalıdır.

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',
  ));
}

"Hello Dolly" Eklentisini Silme

"Hello Dolly" eklentisini silmek için ( üzgünüm Matt )delete_plugins() fonksiyonu kullanacağız . dizine delete_plugins()göre bir dosya yolu dizisi bekler /wp-content/includes/. İçin Hello Dolly dosya yolu eklentisi basitçe hello.phpberi Hello Dolly eklentisi, bu kendi dizinde saklanmaz ama çoğu eklentileri için o şeklinde olacak {$subdir}\{$filename}.php; yani Akışmet'in dosya yolu akismet/akismet.php.

Ancak, delete_plugins()biz dahil ettik kadar mevcut değildir /wp-admin/includes/plugin.phpve bir bağımlılık ile de orada wp-admin/includes/file.phpböylece require_once()dediğimiz olanların hem önce delete_plugins(). Sonunda ana eklenti dosyasının silinmeye çalışılmadan önce var olup olmadığını görmek için WP_PLUGIN_DIRbirleştirilmiş bir sabit kullanıyoruz (eksik bir dosyayı silmeye çalışmamızın önemi yoktur, ancak ilk önce gerçekten kontrol etmek daha zordur ve bunun nasıl yapılacağını bilmek gerekebilir. başka bir nedenden dolayı) :file_exists()

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'));

delete_plugins()Dosya izinleri veya belki de bir eklentinin şu anda aktif olması veya ilk önce çözmeniz gereken başka bir nedenden ötürü bazen başarısız olacağına dikkat edin , ancak kullanım durumumuz için Hello Dolly bir mücadele etmeden ortadan kalkar.

Depo Eklentilerini İndirme, Kurma ve Etkinleştirme

Aslında şu anda depodan eklentileri indirmeye ihtiyacım yok (sadece güzel olacağını düşünmüştüm) , bu gereksinimin kaymasına ve daha sonra tekrar ziyaret etmesine izin vereceğiz.

Eklentileri Etkinleştirme

Ardından kendi özel eklentilerimizi etkinleştiriyoruz. Onları zaten eklenti dizinine yüklediğimizi ve WordPress için onları etkinleştirmek için tek yapmamız gereken varsayılıyor . ( Not : Bu teknik, depo eklentilerini etkinleştirmek için de çalışacaktır, önce bunları indirmeyecek ve kurmayacaktır.)

Dahil olmayı gerektiren ancak yalnızca etkinleştirmeyi otomatikleştirmeniz ve silmeyi gerektirmeniz gerekmiyorsa gerekmeyen activate_plugin()işlevi kullanacağız .delete_plugins()/wp-admin/includes/plugin.php/wp-admin/includes/file.php

Varlığı tekrar test edeceğiz (eğer orada değilse etkinleştirmeniz gerekmiyor, eh?) Ve ayrıca is_plugin_active()eklentinin henüz etkinleştirilmemiş olduğu fonksiyonu kullanarak da doğrulayacağız . Not Bu sefer ( $plugin_filepathve $plugin_dir) eklenti tanımlayıcısının birçok kez çoğaltılmasını önlemek için birkaç değişken kullandım .

Aşağıdaki örnekte alt dizinde my-custom-plugin.phpbulunan eklentiyi etkinleştiriyoruz my-custom-plugin:

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);

Tercih Edilen Temanızı Etkinleştirme

Bir temayı etkinleştirmek, bir eklentiyi silmek veya etkinleştirmek, karşılaştırmalı olarak konuşmaktan biraz daha kolaydır; bir işlev çağrısı yapılması gereken tek şey ise: switch_theme(). switch_theme()İşlevi, iki kabul eder (2) : parametreler şablonu ve stil . En azından parametrelerin ismi bu. Ebeveyn Teması ve Çocuk Teması terimlerini daha iyi biliyor olabilirsiniz .

WordPress'in Ana Tema olarak geldiği varsayılan TwentyTen temasına sahip bir Çocuk Teması oluşturduğunuzu ve onu "Özel Temam " olarak adlandırıp dizine yerleştirdiğinizi varsayarsak , bu çağrıyı kullanarak temanızı etkinleştirirsiniz:/wp-content/themes/my-custom-theme

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

Ama ya bir çocuk teması değilse? Bu kolay, sadece slug / tema tanımlayıcısını (yani /wp-content/themestemanızı içeren alt dizinin adını ) her iki parametre olarak iletin. Tematik temayı aktive etmek istediğinizi varsayarsak , Ian D Stewart şöyle çağırır switch_theme():

switch_theme('thematic', 'thematic');

Şahsen, burada her iki ayrıntıyı da takip etmek zorunda kalmamın biraz zor olduğunu düşünüyorum, bu yüzden işlevi activate_my_theme()kontrol etmek için ilk kontrolleri yapan get_current_theme()ve onu etkinleştirmeyenler varsa denilen bir işlev yazdım . Sadece alt temayı (yani "stil sayfası") söylemeniz gerekir ve işlevden ayrıntıları alarak sizin için ana temayı ("şablon") belirlerget_theme() .

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']
    );
  }
}

Dikkat edilmesi gereken bir anahtar nokta ; get_theme()fonksiyon beklediği Geçilecek adını Çocuk Teması ait DEĞİL 's dizin sümüklüböcek / tema tanımlayıcı. (Ad, tema style.cssdosyasının başlığındaki "Tema Adı:" bölümünden gelir . Neyse ki, get_current_theme()işlev de adı döndürür.)

style.cssWordPress varsayılan teması dosyasındaki başlığı inceleyen Twenty Ten ismini görüyoruz aslında '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
*/

Silme "Merhaba Dünya" Yayınla

Ardından "Merhaba Dünya" yayınını silmek istiyoruz . @Rarst'ın bize wp_delete_post()tam olarak ihtiyacımız olan işlevi nasıl kullanacağımızı gösterdiğini görmüş olabilirsiniz . Açıkladığı gibi, ikinci parametre postu çöp kutusuna taşımak yerine tamamen siler ve ilk parametre olandır $post->ID.

Elbette bunun yerine sümüklü böcek belirtmek güzel olurdu $post->IDve bunun için bir yol bulmaya karar verdim. Bazı hecelemelerden sonra WordPress'in adlandırılmış bir fonksiyona sahip olduğunu ve get_page_by_path()bunun aslında herhangi bir yazı tipini sümüklü suyla aramamıza izin verdiğini öğrendim (ne yazık ki, çünkü yazı tipleri ile çalışan bir şey bulmaya çalışırken göz ardı edebilirsiniz 'page'.)

get_page_by_path()WordPress tanımlı sabiti geçtiğimizden bu yana OBJECTbize post nesne biçiminde bir yazı döndürecektir. Üçüncü parametre 'post'için şunu yazdık: Bunun için yazı tiplerine bakmak istedik 'post'. Yana get_page_by_path()yayınlayamıyorlar gerekmez nesne veya dönüşünü dönecektir nullhiçbir sonrası sümüklüböcek eşleşirse biz varlığı için kontrol ve aynı zamanda bir arama yapabilirsiniz:

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

Not: Veritabanındaki her gönderiyi silmek için kod çalıştırabiliriz, ancak elimizde tutmak istediğimiz gönderileri ekledikten sonra bu kodu tekrar çalıştıramazdık ve tasarım kısıtlamalarımızdan biriydi.

Sonraki...

Bunu bitirene kadar ya da başkası yardım edene kadar anlamaya devam edeceğim.


Bu gerçekten yararlı, herhangi bir işlevselliği buraya ekleme şansınız var mı?
jjeaton,

@jjeaton - Kısa cevap: Evet, ama ... . Daha uzun cevap: Haftalar olmasa da birkaç gün olacak. En son buraya yazdığımdan beri bu sorunla ilgili önemli çalışmalar yaptım ancak müşterim bir projeyi bitirmek için bastırıyor ve arkamda kalıyorum, bu yüzden ... yazmak için boş vaktin olsun. BTW, en çok hangi yönleriyle ilgileniyorsunuz?
MikeSchinkel

Tabii ki, hiç acele yok. Bu sorunun gerçekten değerli olacağını düşünüyordum ve bu yüzden tüm çözümü görmek istedim. Birkaç WordPress sitesi çalıştırıyorum ve her zaman onlar üzerinde yapmam gereken tekrarlı bakımı otomatikleştirmenin yollarını arıyorum (eklenti güncellemeleri, yükseltmeleri vb.), Bu yüzden bazıları gerçekten değerli.
jjeaton,

4

İstenilen Kalıcı Bağlantıları Ayarla

HTML5 / CSS3 fonksiyonelliğine yoğun bir şekilde odaklanan bu hafta karşılaştığım yeni (harika) bir tema projesi, bazı boylerli içerik oluşturmak, kalıcı bağlantı ayarlarını dahil etmek, site kurulumu için göreceli bir kök oluşturmak vb. özellikler tema etkinleştirme denir. Proje denir Roots ve kod indirilebilir burada ; Bu kod için kredi kullanmıyorum. Bununla birlikte, burada permalink yapısı olarak auto-set / year / postname kodu (ve global $ pagenow için aşağıdaki aktivasyon kancaları burada açıklanmıştır: 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, bu soru üzerinde çalışmaya devam etmeyi planlıyorlar ... Fakat başka birçok plan bekletiliyor. :) Buradaki yazı gönderiminden ziyade eğitim dışı kapsamlı üçüncü taraf kod snippet'lerine bağlanmanın daha iyi olduğuna dikkat etmek istiyorum. Bu site cc-wiki lisansı altında kullanıcı katkıları koyar, böylece koda uygulandığında durum bulanık ve karışık olur.
Rarst

Elbette, elbette. Yine de burada müthiş bir gelişme var. Bu, önerinize çok yakışan bir çağrı, bir ya da iki kez Stack Exchange bloğunun etrafında bulundum, ancak lisans uygulamaları hakkında hiç düşünmedim. Kodumu aşağıya yazdım ve sağladığım bağlantılarda kodun geri kalanı kolayca elde edildi. Tavsiyeniz için teşekkürler :)

3

Hello Post'u sil (yorumlu)

wp_delete_post( 1, true );

Doktorlardan wp_delete_post()doğruca. İkinci parametre, çöp kutusuna taşınmak yerine onu tamamen yok eder.

Menü oluştur

Bu, yeni menü oluşturur ve mevcut tüm sayfaları öğelere öğe olarak ekler. Tamamen doğru olduğundan emin değilim, Pagediğer şeyler arasında etiket göstermek için menü öğeleri alamadı . Neyse beynim eriyor, ben bir mola veriyorum. Belki birileri bunu daha güvenilir bir şeye yükseltebilir.

$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 );
}

Merhaba @Rarst : Yorumunuz için teşekkür ederiz. Ah, sen kolay olanı aldın ... ;-) Ben sadece onu yazmak için geri geliyordu.
MikeSchinkel

@MikeSchinkel Şu an yazmadığınız bir şey var mı? Sonuçlarla gelip zaten yapıldığını bulmak menüler koduna dalmak (korkutucu) israf olur. :)
Rarst

Merhaba @Rarst! Listenin sonunda başlar? (şimdiden teşekkürler.)
MikeSchinkel

Tamam, Menülerle uğraşmaya çalışacağım ama söz vermedim. Bu kod içeride karmaşıktır (göz şekerinin ve kullanılabilirliğin bedeli) bu yüzden becerilerimin buna bağlı olduğundan emin değilim.
Rarst

Hey @Rarst - Neredeyse hepsini çalıştırdım ama cevabımı bitirmeden önce muhtemelen 24 saat daha sürecek . Sadece bilmeni istedim, böylece işe koyulmaya çalışırken kendini öldürmedin. Çaba için teşekkürler.
MikeSchinkel

0

Eğer iyi anlarsam, intal instalasyon için istersiniz - o zaman yaklaşımınızın tamamen yanlış olduğundan korkarım.

Çok daha iyi, daha kolay ve standart bir yol, install.php dosyasını oluşturmak ve onu wp-content klasörüne koymaktır - yükleme sırasında otomatik olarak yüklenir.

Buraya kendi wp_install işlevinizi koyabilirsiniz (wordpress kendi işlevinin kullandığı gibi (! Function_exist)), böylece seçeneklerinizi kolayca ayarlayabilir, eklentileri etkinleştirebilir, ilk gönderileri, kategorileri, etiketleri, kullanıcıları ...

İkinci seçenek, mevcut tüm wp'yi silmek istediğiniz durum olabilir (örneğin, cron kullanarak her 30 dakikada bir ayarlanan demo sürümü için) - a) veritabanını kısaltabilir ve yukarıdaki prosedürü kullanabilir ya da aynı.


2
@Thomas Kapler - Cevabınız için teşekkürler ama farklı olmak için yalvarıyorum; benim yaklaşımım "tamamen yanlış" değil . Birincisi, tartıştığım şey, kullanacağınız kodun aynısı install.php, ikincisi install.phpise geçerli olmayan diğer kullanım senaryoları. Evet, install.phpkullandı, ancak ayrıntılara dikkat etmiyor, ne de ima ettiğiniz her derde deva değil.
MikeSchinkel

0

Bu yükleme komut dosyasına bir göz atın. https://github.com/Pravdomil/WP-Quick-Install

Fikirlerini ve bazı kodları alıyorum ve muhtemelen aradığın şeyi yaratıyorum.

Özellikler kurulum veritabanı, farklı diller, kullanıcılar oluşturmak, temel site ayarlarını belirlemek, varsayılan eklentileri ve şablonları silmek, eklentileri ve temaları yüklemek ve etkinleştirmek, varsayılan avatar, kalıcı bağlantılar, statik ön sayfadır.

Katkıda bulunmaktan düştü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.