Script di inizializzazione per aspetti "standard" di un sito Web WordPress?


23

Sto per scrivere uno script per eseguire una nuova installazione di WordPress 3.0.1 e aggiungere tutte le funzionalità iniziali di un sito Web . Questo è per un'azienda che installa molti siti Web simili e hanno bisogno di un punto di partenza standard nella configurazione e nei dati.

  • Mi chiedo se qualcun altro lo abbia già fatto e in tal caso se possano condividere il loro codice?

Immagino che modificheremo questo script ogni volta che creano un nuovo sito in modo che la codifica sia corretta, anche se alla fine (dopo sufficiente esperienza) mi piacerebbe convertire in un plugin.

Ecco l'elenco di attività di base di cui penso avremo bisogno (queste presumono di aver iniziato con WordPress 3.0.1 già installato e i miei plug-in personalizzati e il tema personalizzato copiati nelle directory appropriate) :

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

Questo è tutto (anche se potrei identificarmi di più man mano che ci entro).

Ancora una volta, sto cercando un codice che posso semplicemente copiare e modificare in modo da non dover capire da solo tutti questi dettagli (che non è difficile, solo noioso e richiede tempo) .

Oh, ancora una cosa, devo iniziare ora, quindi prima è, meglio è! :-)


Potresti chiarire questo Create Menus for Custom Pages? Intendi singole aree di menu in alcune pagine o cosa?
Rarst

Ciao @Rarst : ho bisogno di creare tre menu ciascuno con voci di menu che rimandano alle Pagine personalizzate che aggiungerò (il mio uso di "Personalizzato" è probabilmente confuso, lascerò perdere quella parola e dico semplicemente "Pagine" ). Devo aggiungere tre menu e voci di menu per ognuno dei quali una delle voci di menu deve essere collegata alla pagina di accesso.
MikeSchinkel,

Perché eliminare il plug-in "Hello Dolly"? Voglio dire, capisco perché non lo vuoi lì, ma la sua presenza non influisce sul funzionamento del sito e se usi la funzione di aggiornamento automatico, verrà ripristinata ogni volta che viene rilasciata una nuova versione.
Doug,

2
Ciao @Doug : perché eliminare Hello Dolly? Risposta semplice: il cliente non lo vuole lì. :)
MikeSchinkel,

Risposte:


20

Come ho già detto, avrei iniziato a lavorare immediatamente su questa esigenza, quindi sto facendo progressi. Dato che li sto buttando giù, ho pensato che fosse meglio iniziare a pubblicarli. Tuttavia, se qualcun altro può / pubblicherà (alcune delle) parti che non ho fatto, sarò felice di farti copiare qualunque cosa avessi fatto e di selezionare la tua risposta come migliore risposta. Fino ad allora inizierò a pubblicare il codice.

Prima cosa: includere wp-load.php:

Poiché stiamo creando un file autonomo nella radice del sito Web per eseguire l'inizializzazione che verrà utilizzato solo per " avviare " un sito (che ho chiamato mio /my-init.php) , iniziamo includendo il /wp-load.phpcaricamento delle funzioni dell'API di WordPress:

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

Creazione di utenti per il sito

Useremo la wp_insert_user()funzione che si trova in /wp-includes/registration.phpper creare i nostri utenti. Questo file non viene caricato per impostazione predefinita, quindi dovremo caricarlo da soli con una chiamata a require_once().

Useremo anche la get_user_by()funzione per vedere prima se l'utente è già stato creato; non è necessario eseguire il codice due volte se non lo sono. NOTA: questo è un modello che seguirà; ad esempio, il nostro script non dovrebbe duplicare o sovrascrivere nulla se chiamato più volte, soprattutto dopo che gli utenti hanno aggiunto o modificato i dati per uno degli elementi che intendiamo inizializzare.

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

Eliminazione del plug-in "Hello Dolly"

Per cancellare il plugin "Hello Dolly" ( scusate Matt ) useremo la delete_plugins()funzione. delete_plugins()si aspetta una matrice di percorsi di file relativi alla /wp-content/includes/directory. Per il plug-in Hello Dolly il percorso del file è semplicemente hello.phppoiché il plug-in Hello Dolly non è archiviato nella sua directory ma per la maggior parte dei plug-in sarà sotto forma di {$subdir}\{$filename}.php; cioè il percorso del file per Akismet è akismet/akismet.php.

Tuttavia, delete_plugins()non è disponibile fino a quando non abbiamo incluso /wp-admin/includes/plugin.phpe c'è anche una dipendenza con wp-admin/includes/file.phpquindi require_once()entrambi entrambi prima di chiamare delete_plugins(). Infine usiamo la WP_PLUGIN_DIRcostante combinata con file_exists()per vedere se il file del plug-in principale esiste prima di tentare di eliminarlo (non importa se avessimo tentato di eliminare un file mancante, ma è più elegante controllare prima e potresti aver bisogno di sapere come per qualche altro motivo) :

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

Nota che a volte delete_plugins()fallirà a causa delle autorizzazioni dei file o forse del fatto che un plug-in è attualmente attivato o di qualche altro motivo che dovrai prima risolvere, ma per il nostro caso d'uso Hello Dolly scompare senza combattere.

Download, installazione e attivazione di plug-in repository

In realtà non ho bisogno di scaricare plugin dal repository in questo momento (stavo pensando che sarebbe stato bello avere) lasceremo che questo requisito scorra e lo rivisiteremo in seguito.

Attivazione dei plugin

Il prossimo è l'attivazione dei nostri plugin personalizzati. Supponiamo di averli già caricati nella directory dei plug-in e tutto ciò di cui abbiamo bisogno per attivarli per WordPress. ( Nota : questa tecnica funzionerà anche per l'attivazione dei plugin del repository, semplicemente non li scaricherà e non li installerà prima.)

Utilizzeremo la activate_plugin()funzione che delete_plugins()richiede /wp-admin/includes/plugin.phpdi essere inclusa, ma non è necessaria /wp-admin/includes/file.phpnel caso in cui sia necessario solo automatizzare l'attivazione e non la cancellazione.

Verificheremo di nuovo l'esistenza (non è necessario attivarlo se non c'è, eh?) E verificheremo anche utilizzando la is_plugin_active()funzione che il plugin non è già stato attivato. Nota questa volta ho usato alcune variabili ( $plugin_filepathe $plugin_dir) per evitare di duplicare più volte l'identificatore del plugin.

Il nostro esempio che segue attiva il plugin my-custom-plugin.phpche si trova nella my-custom-pluginsottodirectory:

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

Attivazione del tema preferito

Attivare un tema è un po 'più semplice che cancellare o attivare un plugin, relativamente parlando; una chiamata di funzione è tutto ciò che è necessario: switch_theme(). La switch_theme()funzione accetta due (2) parametri: il modello e il foglio di stile . Bene, almeno questo è il nome dei parametri. Potresti avere più familiarità con i termini Tema principale e Tema secondario .

Supponendo che tu abbia creato un tema figlio con il tema TwentyTen predefinito fornito con WordPress come tema principale e che tu l'abbia chiamato "Il mio tema personalizzato" e lo abbia inserito nella /wp-content/themes/my-custom-themedirectory, avresti attivato il tuo tema usando questa chiamata:

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

E se non fosse un tema figlio? È facile, basta passare il identificatore di slug / tema della directory (ovvero il nome della sottodirectory /wp-content/themesche contiene il tema) come entrambi i parametri. Supponendo che tu voglia attivare il tema tematico di Ian D Stewart, lo chiami switch_theme()così:

switch_theme('thematic', 'thematic');

Personalmente penso che sia un po 'strano dover tenere traccia di entrambi i dettagli qui, quindi ho scritto una funzione chiamata activate_my_theme()che prima controlla per assicurarsi che la get_current_theme()funzione e se non la attiva. Devi solo dirgli il tema figlio (aka il "foglio di stile") e capire il tema principale per te (aka il "modello") afferrando i dettagli dalla get_theme()funzione.

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

Un punto chiave da tenere presente ; ilget_theme() funzione prevede di passare il nome del tema figlio, NON l'identificativo della lumaca / tema della directory. (Il nome deriva dalla sezione "Nome tema:" nell'intestazione del style.cssfile del tema . Fortunatamente anche la get_current_theme()funzione restituisce il nome.)

Ispezionando l'intestazione nel style.cssfile del tema predefinito di WordPress Twenty Ten vediamo che il suo nome è in realtà '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
*/

Eliminazione del post "Hello World"

Quindi vogliamo eliminare il post "Hello World" . Potresti aver visto che @Rarst ci ha mostrato come utilizzare la wp_delete_post()funzione che è esattamente ciò di cui abbiamo bisogno. Come ha spiegato, il secondo parametro eliminerà completamente il post anziché spostarlo nel cestino e il primo parametro è il $post->ID.

Naturalmente sarebbe bello poter specificare la lumaca invece di $post->IDe quindi decido di trovare un modo per farlo. Dopo un po 'di spelunking ho scoperto che WordPress ha una funzione chiamata sfortunatamente chiamata get_page_by_path()che in realtà ci consente di cercare qualsiasi tipo di post dal suo slug (è purtroppo chiamato perché potresti trascurarlo quando cerchi di trovare qualcosa che funzioni con tipi di post diversi da 'page'.)

Dal momento che passando get_page_by_path()la costante definita da WordPress OBJECTci restituirà un post sotto forma di un oggetto post. Per il terzo parametro che abbiamo passato'post' per indicare che volevamo cercare tipi di post di 'post'. Poiché get_page_by_path()restituirà l'oggetto postale di cui abbiamo bisogno o restituiamo nullse nessun post corrisponde allo slug, possiamo verificare l'esistenza e fare una ricerca allo stesso tempo:

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

Nota: avremmo potuto eseguire il codice per eliminare tutti i post nel database, ma se avessimo non saremmo in grado di eseguire nuovamente questo codice dopo aver aggiunto i post che vogliamo mantenere e questo è stato uno dei nostri vincoli di progettazione.

Il prossimo...

Continuerò ad aggiungere a questo mentre lo capisco fino a quando non ho finito o fino a quando qualcun altro non aiuta.


Questo è davvero utile, hai qualche possibilità di includere il resto della funzionalità qui?
jjeaton,

@jjeaton - Risposta breve: Sì, ma ... . Risposta più lunga: saranno alcuni giorni se non settimane. Ho fatto un lavoro significativo su questo problema dall'ultima volta che ho scritto qui, ma il mio cliente sta spingendo per finire un progetto e sono indietro, quindi ... se puoi aspettare un po ', lo posterò appena posso prendi il tempo libero per scriverlo. A proposito, quali aspetti ti interessano di più?
MikeSchinkel,

certo, nessuna fretta. Pensavo che questa domanda sarebbe stata davvero preziosa e quindi volevo vedere l'intera soluzione. Gestisco diversi siti WordPress e cerco sempre modi per automatizzare la manutenzione ripetitiva che devo fare su di essi (aggiornamenti dei plugin, aggiornamenti, ecc.), Quindi alcuni di questi sono davvero preziosi.
jjeaton,

4

Imposta permalink desiderati

Un nuovo (fantastico) progetto a tema che mi sono imbattuto questa settimana che è fortemente focalizzato sulla funzionalità HTML5 / CSS3 ha il suo script 'bootstrap' per creare alcuni contenuti di plateplate, incorporare impostazioni permalink, impostare una radice relativa per l'installazione del sito, ecc. Questi le funzioni vengono chiamate all'attivazione del tema. Il progetto si chiama Roots e il codice può essere scaricato qui ; Non mi merito per questo codice. Detto questo, ecco il codice da impostare automaticamente / year / postname come struttura del permalink (e gli hook di attivazione di seguito per $ pagenow globali sono spiegati qui: 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, ci sono piani per continuare a lavorare su questa domanda ... Ma come molti altri piani sono in sospeso. :) Voglio notare che è meglio collegarsi a frammenti di codice di terze parti non didattici piuttosto che pubblicare temi qui. Questo sito mette i contributi degli utenti sotto licenza cc-wiki in modo che la situazione diventi oscura e confusa quando applicata al codice.
Rarst

Di sicuro, di sicuro. C'è comunque un progresso straordinario qui. È una grande chiamata al tuo suggerimento, sono stato nel blocco Stack Exchange una volta o due, ma non ho mai pensato alle implicazioni della licenza. Ho modificato il mio codice verso il basso e il resto del codice è facilmente ottenibile tramite i collegamenti forniti. Grazie per la punta :)

3

Elimina Hello Post (con commento)

wp_delete_post( 1, true );

Direttamente dai wp_delete_post()documenti. Il secondo parametro lo annulla completamente, invece di spostarsi nel cestino.

Crea menu

Questo crea un nuovo menu e aggiunge tutte le pagine esistenti come elementi ad esso. Non sono sicuro che sia del tutto corretto, non sono stato in grado di ottenere le voci di menu per mostrare l' Pageetichetta tra le altre cose. Comunque il mio cervello si sta sciogliendo, quindi mi sto prendendo una pausa. Forse qualcuno sarà in grado di aggiornare questo a qualcosa di più affidabile.

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

Ciao @Rarst : grazie per aver commentato. Ah, hai preso quello facile ... ;-) Stavo solo tornando per scriverlo.
MikeSchinkel,

@MikeSchinkel Qualcosa che non stai scrivendo in questo momento? Sarebbe uno spreco immergersi nel codice dei menu (è spaventoso) per arrivare al risultato e scoprire che è già fatto. :)
Rarst

Ciao @Rarst! Inizia alla fine dell'elenco? (grazie in anticipo.)
MikeSchinkel,

Ok, proverò a gestire i menu, ma nessuna promessa. Quel codice è complesso all'interno (prezzo di piacere per gli occhi e usabilità), quindi non sono sicuro che le mie capacità siano all'altezza.
Rarst

Hey @Rarst - Ho praticamente fatto funzionare tutto, ma probabilmente ci vorranno altre 24 ore prima che io possa finire la mia risposta. Volevo solo farti sapere in modo da non ucciderti nel tentativo di farlo funzionare. Grazie per lo sforzo.
MikeSchinkel,

0

Se lo capisco bene, lo vuoi per l'installazione iniziale - quindi ho paura che il tuo approccio sia totalmente sbagliato.

Un modo molto migliore, più semplice e standardizzato è quello di creare install.php e metterlo nella cartella wp-content - viene caricato automaticamente durante l'installazione.

Lì puoi mettere la tua funzione wp_install (come usa la funzione wordpress se ((function_exist)) in modo da poter facilmente impostare le tue opzioni, attivare plugin, riempire post iniziali, categorie, tag, utenti ...

La seconda opzione potrebbe essere per la situazione, in cui si desidera cancellare il wp già esistente (ad es. Per la versione demo impostata ogni 30 minuti ad esempio utilizzando cron) - è possibile a) troncare il database e utilizzare la procedura sopra o creare il plugin che esegue il stesso.


2
@Thomas Kapler - Grazie per la risposta, ma mi permetto di dissentire; il mio approccio non è "totalmente sbagliato". In primo luogo, quello che discuto è lo stesso codice in cui useresti install.php, e in secondo luogo ci sono altri casi d'uso in cui install.phpnon è applicabile. Sì, install.phpha il suo uso ma non si prende cura dei dettagli né è per la panacea che implica che sia.
MikeSchinkel,

0

Dai un'occhiata a questo script di installazione. https://github.com/Pravdomil/WP-Quick-Install

Prendo le tue idee e un po 'di codice e creo qualcosa che probabilmente stai cercando.

Le caratteristiche sono database di installazione, lingue diverse, creazione di utenti, impostazione di base del sito, eliminazione di plugin e modelli predefiniti, download installazione e attivazione di plugin e temi, avatar predefinito, permalink, prima pagina statica.

Sentiti libero di contribuire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.