Skrypt inicjujący dla „standardowych” aspektów strony internetowej WordPress?


23

Mam zamiar napisać skrypt, aby pobrać świeżą instalację WordPress 3.0.1 i dodać wszystkie początkowe funkcje strony internetowej . To jest dla firmy, która instaluje wiele podobnych stron internetowych i potrzebuje standardowego punktu wyjścia w konfiguracji i danych.

  • Zastanawiam się, czy ktoś już to zrobił, a jeśli tak, czy może udostępnić swój kod?

Przewiduję, że poprawimy ten skrypt za każdym razem, gdy tworzą nową stronę, więc kodowanie jest w porządku, chociaż ostatecznie (po wystarczającym doświadczeniu) chciałbym przekonwertować na wtyczkę.

Oto podstawowa lista zadań, które moim zdaniem będą potrzebne (zakładam, że zacząłem z WordPress 3.0.1 już zainstalowanym, a moje niestandardowe wtyczki i motyw niestandardowy skopiowane do odpowiednich katalogów) :

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

To wszystko (chociaż mogę się w tym dowiedzieć więcej).

Ponownie szukam kodu, który mogę po prostu skopiować i zmodyfikować, aby nie musiałem samodzielnie wymyślać wszystkich tych szczegółów (co nie jest trudne, po prostu żmudne i czasochłonne) .

Och, jeszcze jedno, muszę zacząć od tego teraz, więc im szybciej, tym lepiej! :-)


Czy możesz to wyjaśnić Create Menus for Custom Pages? Masz na myśli poszczególne obszary menu na niektórych stronach lub co?
Rarst

Cześć @Rarst : Muszę utworzyć trzy menu z pozycjami menu, które prowadzą do stron niestandardowych, które dodam (moje użycie „Niestandardowego” jest prawdopodobnie mylące, upuszczę to słowo i po prostu powiedzę „Strony” ). Muszę dodać trzy menu i pozycje menu dla każdego miejsca, w którym jeden z elementów menu musi połączyć się ze stroną logowania.
MikeSchinkel,

Po co usuwać wtyczkę „Hello Dolly”? Rozumiem, dlaczego tego nie chcesz, ale jego obecność nie wpływa na działanie witryny, a jeśli użyjesz funkcji automatycznej aktualizacji, będzie ona przywracana za każdym razem, gdy zostanie wydana nowa wersja.
Doug

2
Cześć @Doug : Dlaczego usunąć Hello Dolly? Prosta odpowiedź: klient tego nie chce. :)
MikeSchinkel

Odpowiedzi:


20

Jak wspomniałem , od razu zacznę pracować nad tą potrzebą, więc robię postępy. Biorąc pod uwagę, że je przewracam, pomyślałem, że najlepiej zacząć je publikować. Mimo to, jeśli ktoś inny może / opublikuje (niektóre) części, których nie zrobiłem, z przyjemnością pozwolę Ci skopiować wszystko, czego nie zrobiłem, i wybierz odpowiedź jako najlepszą odpowiedź. Do tego czasu zacznę pisać kod.

Pierwsza rzecz: obejmują wp-load.php:

Ponieważ tworzymy samodzielny plik w katalogu głównym witryny, aby uruchomić inicjalizację, która będzie używana tylko do „bootstrapowania” witryny (nazwałem moją /my-init.php) , zaczynamy od włączenia /wp-load.phpfunkcji API WordPress:

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

Tworzenie użytkowników dla witryny

Użyjemy wp_insert_user()funkcji znajdującej się w, /wp-includes/registration.phpaby utworzyć naszych użytkowników. Ten plik nie jest domyślnie ładowany, więc będziemy musieli załadować go sami z wywołaniem require_once().

Użyjemy również tej get_user_by()funkcji, aby najpierw sprawdzić, czy użytkownik został już utworzony; nie trzeba uruchamiać kodu dwa razy, jeśli nie. UWAGA: wzór ten nastąpi; np. nasz skrypt nie powinien powielać ani zastępować niczego, jeśli zostanie wywołany wiele razy, szczególnie po dodaniu lub zmianie danych przez użytkownika dla dowolnego elementu, który planujemy zainicjować.

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

Usuwanie wtyczki „Hello Dolly”

Aby usunąć wtyczkę „Hello Dolly” ( przepraszam Matt ) użyjemy tej delete_plugins()funkcji. delete_plugins()oczekuje tablicy ścieżek do plików względem /wp-content/includes/katalogu. W przypadku wtyczki Hello Dolly ścieżka pliku jest po prostu, hello.phpponieważ wtyczka Hello Dolly nie jest przechowywana we własnym katalogu, ale w przypadku większości wtyczek będzie miała postać {$subdir}\{$filename}.php; tzn. ścieżka pliku dla Akismet to akismet/akismet.php.

Jednak delete_plugins()nie jest dostępny, dopóki go nie uwzględnimy, /wp-admin/includes/plugin.phpi istnieje również zależność, wp-admin/includes/file.phpwięc require_once()oboje przed zadzwonieniem delete_plugins(). Na koniec używamy WP_PLUGIN_DIRstałej w połączeniu z, file_exists()aby sprawdzić, czy główny plik wtyczki istnieje, zanim spróbujemy go usunąć ( to nie ma znaczenia, jeśli spróbujemy usunąć brakujący plik, ale bardziej elegancko jest najpierw sprawdzić i być może będziesz musiał wiedzieć, jak to zrobić z innego powodu) :

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

Pamiętaj, że czasami delete_plugins()zawodzi z powodu uprawnień do plików lub z powodu faktu, że wtyczka jest obecnie aktywowana lub z innego powodu, który musisz najpierw rozwiązać, ale w naszym przypadku użycia Hello Dolly odchodzi bez walki.

Pobieranie, instalowanie i aktywowanie wtyczek repozytorium

Tak naprawdę nie muszę teraz pobierać wtyczek z repozytorium (myślałem, że byłoby miło mieć taką możliwość) , pozwolimy, aby to wymaganie się zmieniło i wrócimy do niego później.

Aktywowanie wtyczek

Następnie aktywujemy własne niestandardowe wtyczki. Zakładamy, że już przesłaliśmy je do katalogu wtyczek i wszystko, co musimy zrobić, to aktywować je dla WordPress. ( Uwaga : ta technika będzie działać również w przypadku aktywacji wtyczek repozytorium, po prostu nie pobierze i nie zainstaluje ich najpierw).

Skorzystamy z activate_plugin()funkcji, która delete_plugins()wymaga /wp-admin/includes/plugin.phpwłączenia, ale nie jest potrzebna, /wp-admin/includes/file.phpjeśli potrzebujesz tylko zautomatyzować aktywację, a nie usuwanie.

Ponownie przetestujemy istnienie (nie trzeba aktywować, jeśli nie istnieje, co?), A także zweryfikujemy za pomocą is_plugin_active()funkcji, że wtyczka nie została jeszcze aktywowana. Uwaga: Tym razem użyłem kilku zmiennych ( $plugin_filepathi $plugin_dir), aby nie powielać identyfikatora wtyczki wiele razy.

Poniższy przykład aktywuje wtyczkę, my-custom-plugin.phpktóra znajduje się w my-custom-pluginpodkatalogu:

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

Aktywowanie preferowanego motywu

Aktywacja motywu jest nieco łatwiejsza niż usunięcie lub aktywacja wtyczki, mówiąc wprost; jedno wywołanie funkcji jest wszystko, co jest wymagane: switch_theme(). switch_theme()Funkcja przyjmuje dwa (2) parametry: szablon i stylów . Cóż, przynajmniej tak nazywają się parametry. Możesz być bardziej zaznajomiony z terminami Temat nadrzędny i Temat podrzędny .

Zakładając, że utworzyłeś motyw podrzędny z domyślnym motywem TwentyTen, który zawiera WordPress jako motyw nadrzędny, i nazwałeś go „moim niestandardowym motywem” i umieściłeś go w /wp-content/themes/my-custom-themekatalogu, możesz aktywować swój motyw za pomocą tego połączenia:

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

Ale co, jeśli nie jest to motyw podrzędny? To proste, wystarczy podać identyfikator ślimaka katalogu / motywu (tj. Nazwę podkatalogu /wp-content/themeszawierającego motyw) jako oba parametry. Zakładając, że chcesz włączyć motyw tematyczny przez Ian D Stewart pan rozmowę switch_theme()tak:

switch_theme('thematic', 'thematic');

Osobiście uważam, że śledzenie obu szczegółów tutaj jest trochę dziwne, więc napisałem funkcję o activate_my_theme()tej nazwie, która najpierw sprawdza, czy get_current_theme()funkcja jest aktywowana, a jeśli nie, to ją aktywuje. Wystarczy, że powiesz mu motyw potomny (zwany również „arkuszem stylów”), a on obliczy dla Ciebie motyw nadrzędny (zwany również „szablonem”) , pobierając szczegóły z get_theme()funkcji.

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

Jeden kluczowy punkt, o którym należy pamiętać ; że get_theme()oczekuje funkcyjne mają być przekazane na nazwę tego tematu dziecka, NIE jest to identyfikator katalogu ślimak / motywu. (Nazwa pochodzi od sekcji „Nazwa motywu:” w nagłówku style.csspliku motywu . Na szczęście get_current_theme()funkcja zwraca również nazwę).

Po sprawdzeniu nagłówka w style.csspliku domyślnego motywu WordPress Twenty Ten widzimy, że jego nazwa to w rzeczywistości '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
*/

Usuwanie posta „Hello World”

Następnie chcemy usunąć post „Hello World” . Być może zauważyłeś, że @Rarst pokazał nam, jak korzystać z wp_delete_post()funkcji, której dokładnie potrzebujemy. Jak wyjaśnił, drugi parametr całkowicie usunie post, w przeciwieństwie do przeniesienia go do kosza, a pierwszym parametrem jest $post->ID.

Oczywiście byłoby miło móc określić ślimak zamiast $post->IDi dlatego postanowiłem znaleźć sposób, aby to zrobić. Po jakimś spelunkowaniu odkryłem, że WordPress ma niestety nazwaną funkcję, get_page_by_path()która w rzeczywistości pozwala nam wyszukać dowolny typ postu przez jego ślimak (jest niestety nazwany, ponieważ możesz go przeoczyć, próbując znaleźć coś, co działa z typami postów innymi niż 'page').

Ponieważ get_page_by_path()miniemy stałą zdefiniowaną w WordPress OBJECT, zwróci nam post w postaci obiektu posta. W przypadku trzeciego parametru przekazaliśmy, 'post'aby wskazać, że chcemy, aby wyszukiwał typy wpisów 'post'. Ponieważ get_page_by_path()zwróci potrzebny nam post lub zwróci, nulljeśli żaden post nie pasuje do ślimaka, możemy sprawdzić, czy istnieje i jednocześnie wyszukać:

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

Uwaga: Moglibyśmy uruchomić kod, aby usunąć każdy post w bazie danych, ale gdybyśmy tak zrobili, nie moglibyśmy ponownie uruchomić tego kodu po dodaniu postów, które chcemy zachować, i to było jedno z naszych ograniczeń projektowych.

Kolejny...

Będę się do tego dodawał, jak to wymyślę, dopóki nie skończę lub dopóki ktoś inny nie pomoże.


Jest to naprawdę pomocne, czy jest szansa na włączenie tutaj pozostałych funkcji?
jjeaton

@jjeaton - Krótka odpowiedź: Tak, ale ... . Dłuższa odpowiedź: potrwa kilka dni, jeśli nie tygodnie. Dużo pracowałem nad tym problemem od czasu, gdy ostatnio tu pisałem, ale mój klient naciska, aby ukończyć projekt, a ja jestem z tyłu, więc ... jeśli możesz poczekać chwilę, opublikuję go tak szybko, jak to możliwe. zyskaj wolny czas na napisanie tego. BTW, jakie aspekty najbardziej Cię interesują?
MikeSchinkel,

oczywiście w ogóle nie ma pośpiechu. Myślałem, że to pytanie będzie naprawdę cenne i dlatego chciałem zobaczyć całe rozwiązanie. Prowadzę kilka witryn WordPress i zawsze szukam sposobów na zautomatyzowanie powtarzalnej konserwacji, którą muszę na nich wykonywać (aktualizacje wtyczek, uaktualnienia itp.), Więc niektóre z nich są naprawdę cenne.
jjeaton

4

Ustaw pożądane łącza bezpośrednie

Nowy (niesamowity) projekt motywu, na który natknąłem się w tym tygodniu, który mocno koncentruje się na funkcjonalności HTML5 / CSS3, ma własny skrypt „bootstrap” do tworzenia niektórych treści typu szablon, włączania ustawień permalink, ustawiania katalogu głównego instalacji witryny itp. Te są funkcje są wywoływane przy aktywacji motywu. Projekt nazywa się Roots, a kod można pobrać tutaj ; Nie biorę za ten kod. To powiedziawszy, oto kod do automatycznego ustawiania / year / postname jako struktury permalink (i haki aktywacyjne poniżej dla globalnego $ pagenow są wyjaśnione tutaj: 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(); 


    }

?>


Och, są plany kontynuowania pracy nad tym pytaniem ... Ale jak wiele innych planów są wstrzymane. :) Chcę zauważyć, że lepiej jest link do obszernych fragmentów kodu innych niż edukacyjne, niż zamieszczać tutaj motyw. Ta strona umieszcza wpisy użytkowników na licencji cc-wiki, więc sytuacja staje się mętna i myląca, gdy zastosuje się ją do kodu.
Rarst

Na pewno na pewno. Niemniej jednak postęp jest niesamowity. To świetny telefon na twoją sugestię, byłem w okolicy bloku wymiany stosów raz lub dwa, ale nigdy nie myślałem o konsekwencjach licencyjnych. Zmodyfikowałem swój kod, a resztę kodu można łatwo uzyskać pod podanymi linkami. Dzięki za podpowiedź :)

3

Usuń Hello Post (z komentarzem)

wp_delete_post( 1, true );

Prosto z wp_delete_post()dokumentów. Drugi parametr nukuje go całkowicie, zamiast przechodzić do kosza.

Utwórz menu

Spowoduje to utworzenie nowego menu i dodanie do niego wszystkich istniejących stron. Nie jestem pewien, czy jest to całkowicie poprawne, nie mogłem uzyskać pozycji menu, aby pokazać Pagemiędzy innymi etykietę. W każdym razie mój mózg się topi, więc robię sobie przerwę. Może ktoś będzie w stanie uaktualnić to do czegoś bardziej niezawodnego.

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

Cześć @Rarst : Dziękujemy za komentowanie. Ach, wziąłeś ten łatwy ... ;-) Właśnie wróciłem, żeby go napisać.
MikeSchinkel,

@MikeSchinkel Coś, czego teraz nie piszesz? Byłoby marnotrawstwem zanurzenie się w kodzie menu (jest to przerażające), aby przynieść wynik i przekonać się, że jest już zrobiony. :)
Rarst

Cześć @Rarst! Zaczynasz na końcu listy? (z góry dzięki.)
MikeSchinkel,

Ok, spróbuję poradzić sobie z menu, ale żadnych obietnic. Ten kod jest złożony w środku (cena słodyczy i użyteczności), więc nie jestem pewien, czy moje umiejętności są wystarczające.
Rarst

Hej @Rarst - właściwie wszystko działa, ale prawdopodobnie minie jeszcze 24 godziny, zanim skończę odpowiadać. Chciałem cię tylko poinformować, żebyś nie zabił się próbując zmusić go do działania. Dzięki za wysiłek.
MikeSchinkel,

0

Jeśli dobrze to rozumiem, potrzebujesz go do początkowej instalacji - obawiam się, że twoje podejście jest całkowicie błędne.

O wiele lepszym, łatwiejszym i ustandaryzowanym sposobem jest utworzenie install.php i umieszczenie go w folderze wp-content - jest on automatycznie ładowany podczas instalacji.

Tam możesz umieścić własną funkcję wp_install (jak używa własna funkcja wordpress if (! Function_exist)), dzięki czemu możesz łatwo skonfigurować opcje, aktywować wtyczki, wypełniać początkowe posty, kategorie, tagi, użytkowników ...

Druga opcja może dotyczyć sytuacji, w której chcesz wyczyścić już istniejące wp (np. Dla wersji demonstracyjnej konfigurowanej co 30 minut za pomocą crona) - możesz a) tratować bazę danych i skorzystać z powyższej procedury lub utworzyć wtyczkę, która wykona podobnie.


2
@Thomas Kapler - Dziękuję za odpowiedź, ale proszę się różnić; moje podejście nie jest „całkowicie błędne”. Po pierwsze, omawiam ten sam kod, którego użyłbyś install.php, a po drugie, istnieją inne przypadki użycia, w których install.phpnie ma zastosowania. Tak, install.phpma swoje zastosowanie, ale nie zajmuje się szczegółami ani nie sugeruje panaceum.
MikeSchinkel,

0

Spójrz na ten skrypt instalacyjny. https://github.com/Pravdomil/WP-Quick-Install

Biorę twoje pomysły i trochę kodu i tworzę coś, czego prawdopodobnie szukasz.

Funkcje obejmują konfigurację bazy danych, różne języki, tworzenie użytkowników, ustawianie podstawowych ustawień witryny, usuwanie domyślnych wtyczek i szablonów, pobieranie instalacji i aktywacji wtyczek i motywów, domyślnego awatara, permalinki, statyczną stronę główną.

Nie krępuj się przyczynić.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.