Initialisierungsskript für „Standardaspekte“ einer WordPress-Website?

23

Ich bin im Begriff, ein Skript zu schreiben , um eine Neuinstallation von WordPress 3.0.1 durchzuführen und alle anfänglichen Funktionen für eine Website hinzuzufügen . Dies ist für ein Unternehmen gedacht, das viele ähnliche Websites installiert und einen Standard-Ausgangspunkt für Konfiguration und Daten benötigt.

  • Ich frage mich, ob jemand dies bereits getan hat und wenn ja, ob er seinen Code teilen kann.

Ich stelle mir vor, dass wir dieses Skript jedes Mal optimieren, wenn sie eine neue Site erstellen, so dass eine harte Codierung in Ordnung ist, obwohl ich (nach ausreichender Erfahrung) irgendwann in ein Plugin konvertieren möchte.

Hier ist die grundlegende Liste der Aufgaben, die ich für erforderlich halte (vorausgesetzt, ich habe mit WordPress 3.0.1 begonnen und meine benutzerdefinierten Plugins und Designs wurden in die entsprechenden Verzeichnisse kopiert) :

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

Das war's auch schon (obwohl ich mehr identifizieren kann, wenn ich darauf eingehe.)

Ich bin wieder auf der Suche nach Code, den ich einfach kopieren und ändern kann, damit ich nicht all diese Details selbst herausfinden muss (was nicht schwer, nur mühsam und zeitaufwendig ist) .

Oh noch eine Sache, ich muss jetzt damit anfangen, je früher, desto besser! :-)

MikeSchinkel
quelle
Könnten Sie das klären Create Menus for Custom Pages? Meinen Sie einzelne Menübereiche auf einigen Seiten oder was?
Rarst
Hallo @Rarst : Ich brauche drei menuseach mit Menüeinträgen zu erstellen, die auf den benutzerdefinierten Seiten wird ich das Hinzufügen (meine Verwendung von „Custom“ ist wahrscheinlich verwirrend, mir dieses Wort fallen würde und nur sagen , „Seiten“ . ) So Ich muss drei Menüs und Menüelemente für jedes hinzufügen, wobei eines der Menüelemente mit der Anmeldeseite verknüpft werden muss.
MikeSchinkel
Warum das "Hello Dolly" -Plugin löschen? Ich verstehe, warum Sie es dort nicht wollen, aber seine Anwesenheit hat keine Auswirkungen auf den Betrieb der Site. Wenn Sie die automatische Upgrade-Funktion verwenden, wird es jedes Mal wiederhergestellt, wenn eine neue Version veröffentlicht wird.
Doug,
2
Hallo @Doug : Warum Hallo Dolly löschen? Einfache Antwort: Der Kunde will es dort nicht. :)
MikeSchinkel

Antworten:

20

Wie ich bereits erwähnte, würde ich sofort anfangen, an diesem Bedarf zu arbeiten, damit ich Fortschritte mache. Angesichts der Tatsache, dass ich sie niederwerfe, denke ich, dass es am besten ist, mit dem Posten zu beginnen. Dennoch, wenn jemand anderes (einige) Teile posten kann / wird, die ich nicht getan habe, lasse ich Sie gerne kopieren, was ich getan habe, und wähle Ihre Antwort als beste Antwort aus. Bis dahin werde ich den Code veröffentlichen.

Erste Sache: Beinhaltet wp-load.php:

Da wir eine eigenständige Datei im Stammverzeichnis der Website erstellen, um die Initialisierung auszuführen, die nur zum "Booten" einer Site (ich nannte meine /my-init.php) verwendet wird , beginnen wir mit /wp-load.phpdem Laden der WordPress-API-Funktionen:

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

Erstellen von Benutzern für die Site

Wir werden die wp_insert_user()Funktion in verwenden /wp-includes/registration.php, um unsere Benutzer zu erstellen. Diese Datei wird standardmäßig nicht geladen, daher müssen wir sie bei einem Aufruf von selbst laden require_once().

Wir werden die get_user_by()Funktion auch verwenden , um zunächst festzustellen, ob der Benutzer bereits erstellt wurde. Sie müssen den Code nicht zweimal ausführen, wenn dies nicht der Fall ist. HINWEIS: Dies ist ein Muster, das folgen wird. Beispiel: Unser Skript sollte nichts duplizieren oder überschreiben, wenn es mehrmals aufgerufen wird, insbesondere nachdem Benutzer Daten für Elemente hinzugefügt oder geändert haben, die initialisiert werden sollen.

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'        => '[email protected]',
    'user_url'          => 'http://example.com',
    'first_name'        => 'John',
    'last_name'         => 'Smith',
    'comment_shortcuts' => '',
    'use_ssl'           => '0',
    'user_pass'         => '12345',
  ));
}

Löschen des "Hello Dolly" Plugins

Zum Löschen des "Hello Dolly" -Plugins ( sorry Matt ) verwenden wir die delete_plugins()Funktion. delete_plugins()erwartet ein Array von Dateipfaden, die relativ zum /wp-content/includes/Verzeichnis sind. Für das Hello Dolly- Plugin ist der Dateipfad einfach, hello.phpda das Hello Dolly- Plugin nicht in einem eigenen Verzeichnis gespeichert ist, sondern für die meisten Plugins in der Form von {$subdir}\{$filename}.php; dh der Dateipfad für Akismet ist akismet/akismet.php.

Allerdings delete_plugins()ist nicht verfügbar, bis wir aufgenommen haben /wp-admin/includes/plugin.phpund es gibt auch eine Abhängigkeit mit, wp-admin/includes/file.phpso dass wir require_once()beide, bevor wir anrufen delete_plugins(). Schließlich verwenden wir die WP_PLUGIN_DIRKonstante kombiniert mit, um file_exists()zu sehen, ob die Haupt-Plugin-Datei existiert, bevor wir versuchen, sie zu löschen. Dies ist nicht wichtig, wenn wir versuchen, eine fehlende Datei zu löschen aus irgendeinem anderen Grund) :

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

Beachten Sie, dass dies manchmal delete_plugins()aufgrund von Dateiberechtigungen oder der Tatsache, dass ein Plugin derzeit aktiviert ist, oder aufgrund eines anderen Grundes, den Sie zuerst beheben müssen, fehlschlägt. Für unseren Anwendungsfall ist Hello Dolly jedoch kein Problem mehr .

Herunterladen, Installieren und Aktivieren von Repository-Plugins

Ich muss im Moment eigentlich keine Plugins aus dem Repository herunterladen (ich dachte, es wäre nur schön, sie zu haben). Wir lassen diese Anforderung gleiten und sehen sie später noch einmal durch.

Aktivierung Ihrer Plugins

Als nächstes werden unsere eigenen Plugins aktiviert. Wir gehen davon aus, dass wir sie bereits in das Plugin-Verzeichnis hochgeladen haben und sie dafür für WordPress aktivieren müssen. ( Hinweis : Diese Technik funktioniert auch für die Aktivierung von Repository-Plugins, sie werden jedoch nicht zuerst heruntergeladen und installiert.)

Wir werden die Verwendung activate_plugin()Funktion , die gerne delete_plugins()erfordert /wp-admin/includes/plugin.phpaufgenommen, aber nicht müssen , /wp-admin/includes/file.phpfalls Sie nur benötigen , Aktivierung und nicht die Löschung zu automatisieren.

Wir werden erneut auf Existenz testen (müssen nicht aktiviert werden, wenn nicht, was?) Und wir werden auch mithilfe der is_plugin_active()Funktion überprüfen, ob das Plugin noch nicht aktiviert wurde. Hinweis: Ich habe dieses Mal ( $plugin_filepathund $plugin_dir) einige Variablen verwendet , um die Plugin-ID nicht mehrmals zu duplizieren.

In unserem folgenden Beispiel wird das Plugin aktiviert, das my-custom-plugin.phpsich im my-custom-pluginUnterverzeichnis befindet:

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

Aktivieren Sie Ihr bevorzugtes Thema

Das Aktivieren eines Themas ist vergleichsweise einfacher als das Löschen oder Aktivieren eines Plugins. ein Funktionsaufruf ist alles , was erforderlich ist: switch_theme(). Die switch_theme()Funktion akzeptiert zwei (2) Parameter: die Vorlage und das Stylesheet . Nun, zumindest heißen die Parameter so. Möglicherweise kennen Sie die Begriffe Übergeordnetes Thema und Untergeordnetes Thema besser .

Vorausgesetzt , dass Sie ein erstellt haben Child Theme mit dem Standard - TwentyTen Thema , das mit Wordpress ist das kommt Geordnetes Thema und man nennt es „My Custom Theme“ und in das platziert /wp-content/themes/my-custom-themeVerzeichnis, dann würden Sie Ihr Thema mit diesem Anruf aktivieren:

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

Aber was ist, wenn es kein Kinderthema ist? Das ist ganz einfach : Übergeben Sie als beide Parameter den Verzeichnis-Slug / Theme-Bezeichner (dh den Namen des Unterverzeichnisses, aus /wp-content/themesdem Ihr Theme stammt) . Angenommen, Sie möchten das Thematische Thema von Ian D Stewart aktivieren, das Sie folgendermaßen aufrufen switch_theme():

switch_theme('thematic', 'thematic');

Persönlich finde ich es etwas umständlich, beide Details hier im Auge zu behalten, deshalb habe ich eine Funktion namens geschrieben activate_my_theme(), die zuerst prüft, ob die get_current_theme()Funktion funktioniert, und falls nicht, sie aktiviert. Sie müssen nur das untergeordnete Thema (auch als "Stylesheet" bezeichnet) angeben und das übergeordnete Thema (auch als "Vorlage" bezeichnet) ermitteln, indem Sie die Details aus der get_theme()Funktion abrufen .

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

Ein wichtiger Punkt, dessen Sie sich bewusst sein sollten ; Die get_theme()Funktion erwartet, dass der Name des untergeordneten Themas übergeben wird, NICHT die Verzeichnis-Slug / Theme-ID. (Der Name stammt aus dem Abschnitt "Themenname:" in der Kopfzeile der style.cssThemendatei. Glücklicherweise gibt die get_current_theme()Funktion auch den Namen zurück.)

Wenn man den Header in der style.cssDatei des WordPress-Standardthemas Twenty Ten betrachtet , sieht man, dass der Name tatsächlich so lautet '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
*/

Löschen der „Hallo Welt“ Beitrag

Als nächstes wollen wir den Beitrag "Hallo Welt" löschen . Vielleicht haben Sie gesehen, dass @Rarst uns gezeigt hat, wie man die wp_delete_post()Funktion verwendet, die genau das ist, was wir brauchen. Wie er erklärte, löscht der zweite Parameter den Beitrag vollständig, anstatt ihn in den Papierkorb zu verschieben, und der erste Parameter ist der $post->ID.

Natürlich wäre es schön, den Slug anstelle des zu spezifizieren, $post->IDund so entscheide ich mich, einen Weg zu finden, dies zu tun. Nach einigem Spelunking fand ich , dass Wordpress eine leider benannte Funktion aufgerufen hat , get_page_by_path()die tatsächlich ermöglicht es uns , durch seine Slug all Post - Typen zu sehen (es leider genannt, weil man es übersehen könnte , wenn etwas , das funktioniert mit Post - Typen anders als zu finden versuchen 'page'.)

Da wir get_page_by_path()die von WordPress definierte Konstante übergeben OBJECT, wird ein Beitrag in Form eines Beitragsobjekts an uns zurückgegeben. Für den dritten Parameter, den wir übergeben haben 'post', geben wir an, dass er Post-Typen von nachschlagen soll 'post'. Da get_page_by_path()das von uns benötigte Post-Objekt zurückgegeben wird oder nullwenn kein Post mit dem Slug übereinstimmt, können wir das Vorhandensein überprüfen und gleichzeitig eine Suche durchführen:

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

Hinweis: Wir hätten Code ausführen können, um jeden Beitrag in der Datenbank zu löschen. Wäre dies jedoch der Fall, könnten wir diesen Code nicht erneut ausführen, sobald wir die Beiträge hinzugefügt hätten, die wir behalten möchten. Dies war eine unserer Entwurfsbeschränkungen.

Nächster...

Ich werde noch etwas hinzufügen, bis ich fertig bin oder bis jemand anderes hilft.

MikeSchinkel
quelle
Ist das wirklich hilfreich, gibt es eine Chance, den Rest der Funktionalität hier einzubeziehen?
JJeaton
@jjeaton - Kurze Antwort: Ja, aber ... . Längere Antwort: Es werden ein paar Tage sein, wenn nicht Wochen. Ich habe erhebliche Arbeit an diesem Problem geleistet, seit ich das letzte Mal hier geschrieben habe, aber mein Kunde drängt darauf, ein Projekt fertig zu stellen, und ich bin im Rückstand. Wenn Sie etwas warten können, werde ich es veröffentlichen, sobald ich kann Holen Sie sich die freie Zeit, um es aufzuschreiben. Übrigens, welche Aspekte interessieren Sie am meisten?
MikeSchinkel
Natürlich kein Ansturm. Ich dachte, diese Frage wäre wirklich wertvoll und wollte die gesamte Lösung sehen. Ich betreibe mehrere WordPress-Sites und bin immer auf der Suche nach Möglichkeiten, die sich wiederholenden Wartungsarbeiten (Plugin-Updates, Upgrades usw.) zu automatisieren, sodass einige davon wirklich wertvoll sind.
JJeaton
4

Gewünschte Permalinks setzen

Ein neues (fantastisches) Theme-Projekt, das ich diese Woche kennengelernt habe und das sich stark auf HTML5 / CSS3-Funktionalität konzentriert, hat ein eigenes 'Bootstrap'-Skript zum Erstellen von Boilerplate-Inhalten, zum Einbeziehen von Permalink-Einstellungen, zum Festlegen eines relativen Stammverzeichnisses für die Site-Installation usw. Diese Funktionen werden bei der Themenaktivierung aufgerufen. Das Projekt heißt Roots und der Code kann hier heruntergeladen werden . Ich nehme keine Gutschrift für diesen Code. Das heißt, hier ist der Code zum automatischen Setzen von / Jahr / Postname als Permalink-Struktur (und die Aktivierungs-Hooks für globales $ pagenow werden hier erklärt: 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(); 


    }

?>


quelle
Oh, es gibt Pläne, die Arbeit an dieser Frage fortzusetzen ... Aber wie viele andere Pläne sind sie in der Warteschleife. :) Ich möchte darauf hinweisen, dass es besser ist, auf nicht-pädagogische, umfangreiche Code-Snippets von Drittanbietern zu verlinken, als hier ein Thema zu posten. Durch diese Site werden Benutzerbeiträge unter die CC-Wiki-Lizenz gestellt, sodass die Situation bei der Anwendung auf Code trübe und verwirrend wird.
Rarst
Auf jeden Fall auf jeden Fall. Trotzdem sind hier enorme Fortschritte zu verzeichnen. Das ist ein großartiger Aufruf für Ihren Vorschlag. Ich war ein oder zwei Mal im Stack Exchange-Block, habe aber nie über die Auswirkungen auf die Lizenzierung nachgedacht. Ich habe meinen Code nach unten bearbeitet, und der Rest des Codes kann einfach über die von mir angegebenen Links abgerufen werden. Danke für den Tipp :)
3

Hallo Beitrag löschen (mit Kommentar)

wp_delete_post( 1, true );

Direkt von wp_delete_post() Dokumentation. Der zweite Parameter macht es komplett kaputt, anstatt in den Papierkorb zu wechseln.

Erstellen Sie Menüs

Dadurch wird ein neues Menü erstellt und alle vorhandenen Seiten werden als Elemente hinzugefügt. Ich bin mir nicht sicher, ob es völlig korrekt ist. Ich konnte keine Menüpunkte finden, um Pageunter anderem das Etikett anzuzeigen. Trotzdem schmilzt mein Gehirn und ich mache eine Pause. Vielleicht kann jemand ein Upgrade auf etwas Zuverlässigeres durchführen.

$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 );
}
Rarst
quelle
Hi @Rarst : Danke für den Kommentar. Ah, du hast die leichte genommen ... ;-) Ich bin gerade zurückgekommen, um diese aufzuschreiben.
MikeSchinkel
@MikeSchinkel Was schreibst du gerade nicht? Es wäre eine Verschwendung, in den Menü-Code einzutauchen (es ist beängstigend), mit dem Ergebnis zu kommen und festzustellen, dass es bereits erledigt ist. :)
Rarst
Hi @Rarst! Am Ende der Liste beginnen? (Danke im Voraus.)
MikeSchinkel
Ok, ich werde versuchen, mit Menüs umzugehen, aber keine Versprechungen. Dieser Code ist im Inneren komplex (Preis für Augenweide und Benutzerfreundlichkeit), daher bin ich mir nicht sicher, ob meine Fähigkeiten dem gewachsen sind.
Selten
Hey @Rarst - Ich habe so ziemlich alles zum Laufen gebracht , aber es wird wahrscheinlich noch 24 Stunden dauern, bis ich meine Antwort fertig stellen kann. Ich wollte dich nur wissen lassen, damit du dich nicht umgebracht hast, um es zum Laufen zu bringen. Danke für die Mühe.
MikeSchinkel,
0

Wenn ich es gut verstehe, willst du es für die Erstinstallation - dann befürchte ich, dass dein Ansatz völlig falsch ist.

Viel besser, einfacher und standardisierter ist es, install.php zu erstellen und in den Ordner wp-content zu legen - es wird automatisch während der Installation geladen.

Dort können Sie Ihre eigene wp_install-Funktion platzieren (wie es die wordpress-eigene Funktion if (! Function_exist) verwendet), um dort einfach Ihre Optionen einzurichten, Plugins zu aktivieren, erste Beiträge, Kategorien, Tags, Benutzer zu füllen ...

Die zweite Option ist möglicherweise für Situationen vorgesehen, in denen Sie das bereits vorhandene WP löschen möchten (z. B. für eine Demoversion, die alle z. B. 30 Minuten mit cron eingerichtet wird) gleich.


quelle
2
@Thomas Kapler - Danke für deine Antwort, aber ich möchte mich unterscheiden. Mein Ansatz ist nicht "völlig falsch". Erstens gehe ich auf denselben Code ein, den Sie verwenden würden install.php, und zweitens gibt es andere Anwendungsfälle, in denen dies install.phpnicht zutreffend ist. Ja, es install.phphat seinen Nutzen, aber es kümmert sich nicht um die Details und ist auch nicht das Allheilmittel, von dem Sie meinen, dass es das ist.
MikeSchinkel
0

Schauen Sie sich dieses Installationsskript an. https://github.com/Pravdomil/WP-Quick-Install

Ich nehme Ihre Ideen und einen Code und erstelle etwas, wonach Sie wahrscheinlich suchen.

Features sind Setup-Datenbank, verschiedene Sprachen, Benutzer erstellen, grundlegende Site-Einstellungen festlegen, Standard-Plugins und -Vorlagen löschen, Plugins und Designs herunterladen, installieren und aktivieren, Standard-Avatar, Permalinks, statische Startseite.

Fiel frei, um einen Beitrag zu leisten.

pravdomil
quelle