Script d'initialisation pour les aspects «standard» d'un site Web WordPress?

23

Je suis sur le point d'avoir à écrire un script pour prendre une nouvelle installation de WordPress 3.0.1 et ajouter toutes les fonctionnalités initiales d'un site Web . C'est pour une entreprise qui installe beaucoup de sites Web similaires et ils ont besoin d'un point de départ standard dans la configuration et les données.

  • Je me demande si quelqu'un d'autre l'a déjà fait et si oui, s'il peut partager son code?

J'imagine que nous modifierons ce script chaque fois qu'ils créeront un nouveau site, donc le codage en dur est correct, bien que finalement (après suffisamment d'expérience) j'aimerais convertir en plugin.

Voici la liste de base des tâches dont je pense que nous aurons besoin (celles-ci supposent que j'ai commencé avec WordPress 3.0.1 déjà installé et mes plugins personnalisés et mon thème personnalisé copiés dans les répertoires appropriés) :

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

C'est à peu près tout (même si je peux en identifier davantage au fur et à mesure que j'y vais.)

Encore une fois, je cherche du code que je peux simplement copier et modifier pour ne pas avoir à comprendre tous ces détails moi-même (ce qui n'est pas difficile, juste fastidieux et prend du temps) .

Oh encore une chose, je dois commencer maintenant, donc le plus tôt sera le mieux! :-)

MikeSchinkel
la source
Pourriez-vous clarifier celui-ci Create Menus for Custom Pages? Voulez-vous dire des zones de menu individuelles sur certaines pages ou quoi?
Rarst
Salut @Rarst : J'ai besoin de créer trois menus chacun avec des éléments de menu qui pointent vers les pages personnalisées que j'ajouterai (mon utilisation de "Personnalisé" est probablement déroutante, je laisserai tomber ce mot et je dirai simplement "Pages". ) Donc Je dois ajouter trois menus et éléments de menu pour chacun où l'un des éléments de menu doit être lié à la page de connexion.
MikeSchinkel
Pourquoi supprimer le plugin "Hello Dolly"? Je veux dire, je comprends pourquoi vous ne le voulez pas là-bas, mais sa présence n'affecte pas le fonctionnement du site, et si vous utilisez la fonction de mise à niveau automatique, elle sera restaurée à chaque sortie d'une nouvelle version.
Doug
2
Salut @Doug : Pourquoi supprimer Hello Dolly? Réponse simple: le client n'en veut pas. :)
MikeSchinkel

Réponses:

20

Comme je l'ai mentionné, j'allais commencer à travailler sur ce besoin immédiatement alors je fais des progrès. Étant donné que je les supprime, je me suis dit qu'il valait mieux commencer à les publier. Pourtant, si quelqu'un d'autre peut / publiera (certaines) des parties que je n'ai pas faites, je serai heureux de vous laisser copier ce que je n'ai pas fait et de sélectionner votre réponse comme la meilleure réponse. D'ici là, je vais commencer à publier le code.

Première chose: inclure wp-load.php :

Comme nous créons un fichier autonome à la racine du site Web pour exécuter l'initialisation qui ne sera utilisé que pour "bootstrap" un site (j'ai appelé le mien /my-init.php), nous commençons par inclure/wp-load.php le chargement des fonctions de l'API WordPress:

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

Création d'utilisateurs pour le site

Nous utiliserons la wp_insert_user()fonction située dans /wp-includes/registration.phppour créer nos utilisateurs. Ce fichier n'est pas chargé par défaut, nous devrons donc le charger nous-mêmes avec un appel à require_once().

Nous utiliserons également la get_user_by()fonction pour voir d'abord si l'utilisateur a déjà été créé; pas besoin d'exécuter le code deux fois si ce n'est pas le cas. REMARQUE: il s'agit d'un modèle qui suivra; Par exemple, notre script ne doit pas dupliquer ou remplacer quoi que ce soit s'il est appelé plusieurs fois, en particulier après que les utilisateurs ont ajouté ou modifié des données pour l'un des éléments que nous prévoyons d'initialiser.

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

Suppression du plugin "Hello Dolly"

Pour supprimer le plugin "Hello Dolly" ( désolé Matt ), nous utiliserons la delete_plugins()fonction. delete_plugins()attend un tableau de chemins de fichiers relatifs au /wp-content/includes/répertoire. Pour le plugin Hello Dolly, le chemin du fichier est simplement hello.phpcar le plugin Hello Dolly n'est pas stocké dans son propre répertoire, mais pour la plupart des plugins, il sera sous la forme de {$subdir}\{$filename}.php; c'est-à-dire que le chemin du fichier pour Akismet est akismet/akismet.php.

Cependant, delete_plugins()n'est pas disponible jusqu'à ce que nous ayons inclus /wp-admin/includes/plugin.phpet il y a aussi une dépendance avec wp-admin/includes/file.phpnous require_once()deux donc avant d'appeler delete_plugins(). Enfin, nous utilisons une WP_PLUGIN_DIRconstante combinée avec file_exists()pour voir si le fichier du plugin principal existe avant d'essayer de le supprimer (ce n'est pas grave si nous essayions de supprimer un fichier manquant, mais il est plus élégant de vérifier d'abord et vous devrez peut-être savoir comment pour une autre raison) :

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

Notez que parfois delete_plugins()échouera en raison des autorisations de fichier ou peut-être du fait qu'un plugin est actuellement activé ou d'une autre raison que vous devrez d'abord résoudre mais pour notre cas d'utilisation Hello Dolly s'en va sans combat.

Téléchargement, installation et activation des plugins de référentiel

Je n'ai pas vraiment besoin de télécharger les plugins à partir du référentiel pour le moment (je pensais que ce serait bien d'avoir), nous allons laisser cette exigence glisser et la revisiter plus tard.

Activer vos plugins

La prochaine étape consiste à activer nos propres plugins personnalisés. Nous supposons que nous les avons déjà téléchargés dans le répertoire du plugin et tout ce dont nous avons besoin pour les activer pour WordPress. ( Remarque : Cette technique fonctionnera également pour l'activation des plugins de référentiel, elle ne sera tout simplement pas téléchargée et installée en premier.)

Nous utiliserons la activate_plugin()fonction qui, comme elle, delete_plugins()doit /wp-admin/includes/plugin.phpêtre incluse mais n'est pas nécessaire /wp-admin/includes/file.phpau cas où vous auriez seulement besoin d'automatiser l'activation et non la suppression.

Nous allons à nouveau tester l'existence (pas besoin d'activer s'il n'y en a pas, hein?) Et nous vérifierons également en utilisant la is_plugin_active()fonction que le plugin n'a pas déjà été activé. Notez que j'ai utilisé quelques variables cette fois ( $plugin_filepathet$plugin_dir ) pour éviter de dupliquer l'identifiant du plugin plusieurs fois.

Notre exemple qui suit active le plugin my-custom-plugin.phpqui se trouve dans le my-custom-pluginsous - répertoire:

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

Activation de votre thème préféré

L'activation d'un thème est un peu plus facile que la suppression ou l'activation d'un plugin, relativement parlant; un appel de fonction est tout ce qui est nécessaire: switch_theme(). La switch_theme()fonction accepte deux (2) paramètres: le modèle et la feuille de style . Eh bien, c'est du moins le nom des paramètres. Vous connaissez peut-être mieux les termes Thème parent et Thème enfant .

En supposant que vous avez créé un thème enfant avec le thème TwentyTen par défaut fourni avec WordPress comme thème parent et que vous l'avez appelé "Mon thème personnalisé" et que /wp-content/themes/my-custom-themevous l'avez placé dans le répertoire, vous activez votre thème à l'aide de cet appel:

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

Mais que faire si ce n'est pas un thème enfant? C'est facile, il suffit de passer l' identifiant slug / theme du répertoire (c'est-à-dire le nom du sous-répertoire /wp-content/themesqui contient votre thème) comme deux paramètres. En supposant que vous souhaitiez activer le thème thématique d' Ian D Stewart, vous appelez switch_theme()ainsi:

switch_theme('thematic', 'thematic');

Personnellement, je pense que c'est un peu délirant d'avoir à garder une trace des deux détails ici, j'ai donc écrit une fonction appelée activate_my_theme()qui vérifie d'abord la get_current_theme()fonction et sinon l'activer. Vous avez juste besoin de lui dire le thème enfant (alias la "feuille de style") et il comprend le thème parent pour vous (alias le "modèle") en saisissant les détails de la get_theme()fonction.

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 point clé à connaître ; la get_theme()fonction s'attend à recevoir le nom du thème enfant, PAS son identificateur de slug / theme de répertoire. (Le nom provient de la section "Nom du thème:" dans l'en-tête du style.cssfichier du thème . Heureusement, la get_current_theme()fonction renvoie également le nom.)

En inspectant l'en-tête dans le style.cssfichier du thème par défaut WordPress Twenty Ten on voit que son nom est en fait '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
*/

Suppression du message "Hello World"

Ensuite, nous voulons supprimer le message "Hello World" . Vous avez peut-être vu que @Rarst nous a montré comment utiliser la wp_delete_post()fonction qui est exactement ce dont nous avons besoin. Comme il l'a expliqué, le deuxième paramètre supprimera complètement le message au lieu de le déplacer dans la corbeille et le premier paramètre est le$post->ID .

Bien sûr, ce serait bien de pouvoir spécifier le slug au lieu du $post->IDet je décide donc de trouver un moyen de le faire. Après quelques spéléologies, j'ai trouvé que WordPress avait une fonction malheureusement nommée get_page_by_path()qui nous permet en fait de rechercher n'importe quel type de publication par son slug (elle est malheureusement nommée parce que vous pourriez l'ignorer lorsque vous essayez de trouver quelque chose qui fonctionne avec des types de publication autres que 'page'.)

Puisque nous passons get_page_by_path()la constante définie par WordPress, OBJECTelle nous renverra un message sous la forme d'un objet de publication. Pour le troisième paramètre que nous avons passé 'post'pour indiquer que nous voulions qu'il recherche les types de publication de 'post'. Puisque get_page_by_path()retournera l'objet post dont nous avons besoin ou retournera nullsi aucun post ne correspond au slug, nous pouvons vérifier son existence et faire une recherche en même temps:

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

Remarque: Nous aurions pu exécuter du code pour supprimer tous les messages de la base de données, mais si nous l'avions, nous ne pourrions plus exécuter ce code une fois que nous aurions ajouté les messages que nous voulons conserver et c'était l'une de nos contraintes de conception.

Prochain...

Je continuerai d'ajouter à cela pendant que je le découvrirai jusqu'à ce que j'aie terminé ou jusqu'à ce que quelqu'un d'autre aide.

MikeSchinkel
la source
C'est vraiment utile, avez-vous une chance d'inclure le reste des fonctionnalités ici?
jjeaton
@jjeaton - Réponse courte: Oui, mais ... . Réponse plus longue: cela va prendre quelques jours, voire des semaines. J'ai fait un travail important sur ce problème depuis la dernière fois que j'ai écrit ici, mais mon client s'efforce de terminer un projet et je suis derrière, alors ... si vous pouvez attendre un peu, je le posterai dès que possible obtenir le temps libre pour l'écrire. BTW, quels sont les aspects qui vous intéressent le plus?
MikeSchinkel
bien sûr, pas de précipitation du tout. Je pensais que cette question serait vraiment précieuse et je voulais donc voir toute la solution. Je gère plusieurs sites WordPress, et je suis toujours à la recherche de moyens d'automatiser la maintenance répétitive que je dois faire sur eux (mises à jour de plugins, mises à niveau, etc.), donc une partie de cela est vraiment précieuse.
jjeaton
4

Définir les liens permanents souhaités

Un nouveau projet de thème (génial) que j'ai rencontré cette semaine et qui est fortement axé sur la fonctionnalité HTML5 / CSS3 a son propre script de démarrage pour créer du contenu passe-partout, incorporer des paramètres de permalien, définir une racine relative pour l'installation du site, etc. les fonctionnalités sont appelées lors de l'activation du thème. Le projet s'appelle Roots et le code peut être téléchargé ici ; Je ne prends aucun crédit pour ce code. Cela dit, voici le code à définir automatiquement / année / nom de poste comme structure de permalien (et les crochets d'activation ci-dessous pour $ pagenow global sont expliqués ici: 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(); 


    }

?>


la source
Oh, il est prévu de continuer à travailler sur cette question ... Mais comme beaucoup d'autres plans, ils sont en suspens. :) Je tiens à noter qu'il est préférable de créer un lien vers des extraits de code tiers étendus non éducatifs, plutôt que de publier le thème ici. Ce site place les contributions des utilisateurs sous licence cc-wiki afin que la situation devienne trouble et confuse lorsqu'elle est appliquée au code.
Rarst
Bien sûr, bien sûr. Il y a néanmoins des progrès impressionnants ici. C'est un excellent appel à votre suggestion, j'ai été dans le bloc Stack Exchange une ou deux fois, mais je n'ai jamais pensé aux implications de la licence. J'ai édité mon code et le reste du code est facilement accessible via les liens que j'ai fournis. Merci pour l'astuce :)
3

Supprimer Hello Post (avec commentaire)

wp_delete_post( 1, true );

Directement à partir de wp_delete_post()documents. Le deuxième paramètre le supprime complètement, au lieu de passer à la corbeille.

Créer des menus

Cela crée un nouveau menu et y ajoute toutes les pages existantes en tant qu'éléments. Je ne suis pas sûr que ce soit tout à fait correct, je n'ai pas pu obtenir les éléments de menu pour afficher l' Pageétiquette entre autres. De toute façon, mon cerveau fond, alors je fais une pause. Peut-être que quelqu'un pourra le mettre à niveau vers quelque chose de plus fiable.

$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
la source
Salut @Rarst : Merci d'avoir commenté. Ah, vous avez pris le plus facile ... ;-) Je revenais juste pour écrire celui-là.
MikeSchinkel
@MikeSchinkel Quelque chose que vous n'écrivez pas en ce moment? Ce serait un gaspillage de plonger dans le code des menus (c'est effrayant) pour arriver avec le résultat et trouver que c'est déjà fait. :)
Rarst
Salut @Rarst! Commencer à la fin de la liste? (merci d'avance.)
MikeSchinkel
D'accord, je vais essayer de gérer les menus, mais aucune promesse. Ce code est complexe à l'intérieur (prix des bonbons pour les yeux et facilité d'utilisation), donc je ne suis pas sûr que mes compétences soient à la hauteur.
2010
Hey @Rarst - J'ai pratiquement tout fait fonctionner, mais il faudra probablement encore 24 heures avant de terminer ma réponse. Je voulais juste vous le faire savoir pour ne pas vous suicider en essayant de le faire fonctionner. Merci pour l'effort.
MikeSchinkel du
0

Si je le comprends bien, vous le voulez pour une instalation initiale - alors j'ai peur que votre approche soit totalement fausse.

Beaucoup mieux, plus facilement et de manière standardisée consiste à créer install.php et à le placer dans le dossier wp-content - il est automatiquement chargé lors de l'installation.

Là, vous pouvez mettre votre propre fonction wp_install (comme la propre fonction wordpress utilise if (! Function_exist)) afin que vous puissiez facilement configurer vos options, activer les plugins, remplir les messages initiaux, les catégories, les tags, les utilisateurs ...

La deuxième option peut être pour la situation, où vous voulez effacer le wp déjà existant (par exemple pour la version de démonstration configurée toutes les 30 minutes par exemple en utilisant cron) - vous pouvez a) tronquer la base de données et utiliser la procédure ci-dessus, ou créer le plugin qui fait le même.


la source
2
@Thomas Kapler - Merci pour votre réponse mais je vous prie de différer; mon approche n'est pas "totalement fausse". Premièrement, ce dont je parle est le même code que celui que vous utiliseriez install.php, et deuxièmement, il existe d'autres cas d'utilisation qui install.phpne s'appliquent pas. Oui, install.phpil a son utilité, mais il ne prend pas soin des détails ni de la panacée que vous impliquez.
MikeSchinkel
0

Jetez un œil à ce script d'installation. https://github.com/Pravdomil/WP-Quick-Install

Je prends vos idées et du code et je crée quelque chose que vous recherchez probablement.

Les fonctionnalités sont la base de données d'installation, différentes langues, créer des utilisateurs, définir les paramètres de base du site, supprimer les plugins et modèles par défaut, télécharger installer et activer les plugins et les thèmes, avatar par défaut, permaliens, première page statique.

N'hésitez pas à contribuer.

pravdomil
la source