¿Script de inicialización para aspectos "estándar" de un sitio web de WordPress?

23

Estoy a punto de tener que escribir un script para realizar una nueva instalación de WordPress 3.0.1 y agregar todas las características iniciales de un sitio web . Esto es para una empresa que instala muchos sitios web similares y necesitan un punto de partida estándar en configuración y datos.

  • Me pregunto si alguien más ya ha hecho esto y, de ser así, si pueden compartir su código.

Imagino que modificaremos este script cada vez que creen un nuevo sitio, por lo que la codificación está bien, aunque eventualmente (después de suficiente experiencia) me gustaría convertirlo en un complemento.

Aquí está la lista básica de tareas que creo que necesitaremos (suponen que he comenzado con WordPress 3.0.1 ya instalado y mis complementos personalizados y tema personalizado copiados en los directorios apropiados) :

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

Eso es todo (aunque puedo identificar más a medida que me meto).

Nuevamente, estoy buscando un código que pueda copiar y modificar para no tener que resolver todos estos detalles yo mismo (lo cual no es difícil, solo es tedioso y requiere mucho tiempo) .

¡Oh, una cosa más, tengo que comenzar con esto ahora, así que cuanto antes mejor! :-)

MikeSchinkel
fuente
¿Podrías aclarar esto Create Menus for Custom Pages? ¿Te refieres a áreas de menú individuales en algunas páginas o qué?
Rarst
Hola @Rarst : Necesito crear tres menuseach con elementos de menú que enlacen con las páginas personalizadas que agregaré (mi uso de "Personalizado" probablemente sea confuso, dejaré esa palabra y solo diré "Páginas" ). Necesito agregar tres menús y elementos de menú para cada uno donde uno de los elementos del menú debe vincularse a la página de inicio de sesión.
MikeSchinkel
¿Por qué eliminar el complemento "Hello Dolly"? Quiero decir, entiendo por qué no lo quieres allí, pero su presencia no afecta el funcionamiento del sitio, y si usas la función de actualización automática, se restaurará cada vez que se lance una nueva versión.
Doug
2
Hola @Doug : ¿Por qué eliminar Hello Dolly? Respuesta simple: el cliente no lo quiere allí. :)
MikeSchinkel

Respuestas:

20

Como mencioné , iba a comenzar a trabajar en esta necesidad de inmediato, así que estoy avanzando. Dado que estoy derribando estos, pensé que es mejor comenzar a publicarlos. Aún así, si alguien más puede / publicará (algunas de) las partes que no he hecho, estaré encantado de permitirle copiar lo que haya hecho que no haya hecho y seleccionar su respuesta como la mejor respuesta. Hasta entonces, voy a comenzar a publicar el código.

Primera cosa: Incluye wp-load.php:

Como estamos creando un archivo independiente en la raíz del sitio web para ejecutar la inicialización que solo se usará para "arrancar" un sitio (lo llamé mío /my-init.php) , comenzamos por incluir /wp-load.phppara cargar las funciones de API de WordPress:

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

Crear usuarios para el sitio

Utilizaremos la wp_insert_user()función ubicada en /wp-includes/registration.phppara crear nuestros usuarios. Este archivo no se carga de manera predeterminada, por lo que tendremos que cargarlo nosotros mismos con una llamada a require_once().

También usaremos la get_user_by()función para ver primero si el usuario ya ha sido creado; no es necesario ejecutar el código dos veces si no lo han hecho. NOTA: Este es un patrón que seguirá; por ejemplo, nuestro script no debe duplicar ni sobrescribir nada si se llama varias veces, especialmente después de que los usuarios hayan agregado o cambiado datos para cualquiera de los elementos que planeamos inicializar.

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

Eliminar el complemento "Hello Dolly"

Para eliminar el complemento "Hello Dolly" (lo siento Matt ) usaremos la delete_plugins()función. delete_plugins()espera una matriz de rutas de archivos que son relativas al /wp-content/includes/directorio. Para el complemento Hello Dolly, la ruta del archivo es simplemente hello.phpporque el complemento Hello Dolly no está almacenado en su propio directorio, pero para la mayoría de los complementos será en forma de {$subdir}\{$filename}.php; es decir, la ruta del archivo para Akismet es akismet/akismet.php.

Sin embargo, delete_plugins()no está disponible hasta que lo hayamos incluido /wp-admin/includes/plugin.phpy también hay una dependencia con wp-admin/includes/file.phplos require_once()dos antes de llamar delete_plugins(). Finalmente, usamos WP_PLUGIN_DIRconstante combinado con file_exists()para ver si el archivo de complemento principal existe antes de que intentemos eliminarlo (no es importante si tratamos de eliminar un archivo faltante, pero es más elegante verificarlo primero y es posible que necesite saber cómo por alguna otra razón) :

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

Tenga en cuenta que a veces delete_plugins()fallará debido a los permisos de archivo o tal vez el hecho de que un complemento está activado actualmente o alguna otra razón que primero deberá resolver, pero para nuestro caso de uso Hello Dolly desaparece sin luchar.

Descarga, instalación y activación de complementos de repositorio

En realidad, no necesito descargar complementos desde el repositorio en este momento (estaba pensando que sería bueno tenerlo) vamos a dejar pasar este requisito y volver a visitarlo más tarde.

Activando sus complementos

El siguiente paso es activar nuestros propios complementos personalizados. Asumimos que ya los hemos subido al directorio de complementos y todo lo que necesitamos para hacerlo es activarlos para WordPress. ( Nota : esta técnica también funcionará para activar los complementos del repositorio, simplemente no los descargará e instalará primero).

Utilizaremos la activate_plugin()función que delete_plugins()requiere /wp-admin/includes/plugin.phpque se incluya pero no es necesaria /wp-admin/includes/file.phpen caso de que solo necesite automatizar la activación y no la eliminación.

Volveremos a probar la existencia (no es necesario activarla si no está allí, ¿eh?) Y también verificaremos mediante la is_plugin_active()función que el complemento aún no se ha activado. Tenga en cuenta que esta vez utilicé algunas variables ( $plugin_filepathy $plugin_dir) para evitar duplicar el identificador del complemento en numerosas ocasiones.

Nuestro ejemplo que sigue activa el complemento my-custom-plugin.phpque se encuentra en el my-custom-pluginsubdirectorio:

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

Activando su tema preferido

Activar un tema es un poco más fácil que eliminar o activar un complemento, comparativamente hablando; una llamada a la función es todo lo que se requiere: switch_theme(). La switch_theme()función acepta dos (2) parámetros: la plantilla y la hoja de estilo . Bueno, al menos así se llaman los parámetros. Es posible que esté más familiarizado con los términos Tema principal y Tema secundario .

Suponiendo que haya creado un tema secundario con el tema predeterminado TwentyTen que viene con WordPress como tema principal y lo llamó "Mi tema personalizado" y lo colocó en el /wp-content/themes/my-custom-themedirectorio, activaría su tema mediante esta llamada:

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

Pero, ¿y si no es un tema infantil? Eso es fácil, simplemente pase el identificador de directorio slug / theme (es decir, el nombre del subdirectorio /wp-content/themesque contiene su tema) como ambos parámetros. Suponiendo que desea activar el tema temático de Ian D Stewart que ha llamado switch_theme()así:

switch_theme('thematic', 'thematic');

Personalmente, creo que es un poco extraño tener que hacer un seguimiento de ambos detalles aquí, así que escribí una función llamada activate_my_theme()que primero verifica para asegurarse de que la get_current_theme()función y, si no, la activa. Solo necesita decirle el tema secundario (también conocido como la "hoja de estilo") y descubrirá el tema principal para usted (también conocido como la "plantilla") tomando los detalles de la get_theme()función.

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 clave a tener en cuenta ; la get_theme()función espera que se le pase el nombre del Tema secundario, NO su identificador de tema / slug de directorio. (El nombre proviene de la sección "Nombre del tema:" en el encabezado del style.cssarchivo del tema . Afortunadamente, la get_current_theme()función también devuelve el nombre).

Al inspeccionar el encabezado en el style.cssarchivo del tema predeterminado de WordPress Twenty Ten , vemos que su nombre es, de hecho '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
*/

Eliminar la publicación "Hello World"

A continuación, queremos eliminar la publicación "Hello World" . Es posible que haya visto que @Rarst nos ha mostrado cómo usar la wp_delete_post()función, que es exactamente lo que necesitamos. Como explicó, el segundo parámetro eliminará completamente la publicación en lugar de moverla a la papelera y el primer parámetro es el $post->ID.

Por supuesto, sería bueno poder especificar la babosa en lugar de la $post->IDy, por lo tanto, decido encontrar una manera de hacerlo. Después de un poco de espeleología, descubrí que WordPress tiene una función llamada desafortunadamente llamada get_page_by_path()que en realidad nos permite buscar cualquier tipo de publicación por su babosa (desafortunadamente se llama porque podrías pasarla por alto cuando intentas encontrar algo que funcione con tipos de publicación que no sean 'page').

Como pasamos get_page_by_path()la constante definida por WordPress OBJECT, nos devolverá una publicación en forma de un objeto de publicación. Para el tercer parámetro que pasamos 'post'para indicar que queríamos buscar tipos de publicación de 'post'. Dado get_page_by_path()que devolverá el objeto de publicación que necesitamos o devolverá nullsi ninguna publicación coincide con el slug, podemos verificar la existencia y hacer una búsqueda al mismo tiempo:

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

Nota: Podríamos haber ejecutado código para eliminar cada publicación en la base de datos, pero si lo hubiéramos hecho, no podríamos ejecutar este código nuevamente una vez que hayamos agregado las publicaciones que queremos conservar y esa fue una de nuestras limitaciones de diseño.

Próximo...

Seguiré agregando a esto mientras lo descubro hasta que termine o hasta que alguien más me ayude.

MikeSchinkel
fuente
Esto es realmente útil, ¿hay alguna posibilidad de incluir el resto de la funcionalidad aquí?
jjeaton
@jjeaton - Respuesta corta: Sí, pero ... . Respuesta más larga: serán unos días, si no semanas. He trabajado mucho en este problema desde la última vez que escribí aquí, pero mi cliente está presionando para terminar un proyecto y estoy atrasado, así que ... si pueden esperar un poco, lo publicaré tan pronto como pueda. Obtenga el tiempo libre para escribirlo. Por cierto, ¿en qué aspectos estás más interesado?
MikeSchinkel
por supuesto, no hay prisa en absoluto. Estaba pensando que esta pregunta sería realmente valiosa y quería ver la solución completa. Ejecuto varios sitios de WordPress, y siempre estoy buscando formas de automatizar el mantenimiento repetitivo que tengo que hacer en ellos (actualizaciones de complementos, actualizaciones, etc.), por lo que algo de esto es realmente valioso.
jjeaton
4

Establecer enlaces permanentes deseados

Un nuevo (temático) proyecto temático que encontré esta semana que está muy centrado en la funcionalidad HTML5 / CSS3 tiene su propio script 'bootstrap' para crear contenido repetitivo, incorporar configuraciones de enlace permanente, establecer una raíz relativa para la instalación del sitio, etc. Las características se llaman en la activación del tema. El proyecto se llama Roots y el código se puede descargar aquí ; No tomo crédito por este código. Dicho esto, aquí está el código para auto-set / year / postname como la estructura de enlace permanente (y los ganchos de activación a continuación para $ pagenow global se explican aquí: 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(); 


    }

?>


fuente
Oh, hay planes para continuar trabajando en esta cuestión ... Pero como muchos otros planes están en espera. :) Quiero señalar que es mejor vincular a fragmentos de código de terceros extensos no educativos, en lugar de publicar el tema aquí. Este sitio pone las contribuciones de los usuarios bajo licencia cc-wiki, por lo que la situación se vuelve turbia y confusa cuando se aplica al código.
Rarst
Seguro, seguro. No obstante, hay un progreso impresionante aquí. Esa es una gran decisión sobre su sugerencia, he estado alrededor del bloque Stack Exchange una o dos veces, pero nunca pensé en las implicaciones de la licencia. Edité mi código y el resto del código se obtiene fácilmente en los enlaces que proporcioné. Gracias por el consejo :)
3

Eliminar Hello Post (con comentario)

wp_delete_post( 1, true );

Directamente de los wp_delete_post()documentos. El segundo parámetro lo destruye por completo, en lugar de moverlo a la basura.

Crea menús

Esto crea un nuevo menú y agrega todas las páginas existentes como elementos. No estoy seguro de que sea completamente correcto, no pude obtener elementos del menú para mostrar la Pageetiqueta, entre otras cosas. De todos modos mi cerebro se está derritiendo, así que me estoy tomando un descanso. Tal vez alguien pueda actualizar esto a algo más confiable.

$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
fuente
Hola @Rarst : Gracias por comentar. Ah, tomaste la fácil ... ;-) Estaba volviendo para escribirla.
MikeSchinkel
@MikeSchinkel ¿Algo que no estés escribiendo en este momento? Sería un desperdicio sumergirse en el código de los menús (da miedo) obtener el resultado y descubrir que ya está hecho. :)
Rarst
Hola @Rarst! Comience al final de la lista? (gracias de antemano.)
MikeSchinkel
Ok, intentaré manejar Menús, pero no promesas. Ese código es complejo por dentro (precio de los dulces y usabilidad), por lo que no estoy seguro de que mis habilidades estén a la altura.
Rarst
Hola @Rarst : prácticamente lo tengo todo funcionando, pero probablemente pasarán otras 24 horas más o menos antes de que pueda terminar mi respuesta. Solo quería avisarte para que no te mataras tratando de hacerlo funcionar. Gracias por el esfuerzo.
MikeSchinkel
0

Si lo entiendo bien, lo quieres para la instalación inicial, entonces me da miedo que tu enfoque sea totalmente erróneo.

Una forma mucho mejor, más fácil y estandarizada es crear install.php y ponerlo en la carpeta wp-content: se carga automáticamente durante la instalación.

Allí puede poner su propia función wp_install (como la función propia de wordpress usa if (! Function_exist)) para que pueda configurar fácilmente sus opciones, activar complementos, llenar publicaciones iniciales, categorías, etiquetas, usuarios ...

La segunda opción puede ser para la situación, donde desea borrar el wp ya existente (por ejemplo, para la versión de demostración configurada cada 30 minutos usando cron): puede a) truncar la base de datos y usar el procedimiento anterior, o crear el complemento que realiza el mismo.


fuente
2
@Thomas Kapler - Gracias por su respuesta pero le ruego que difiera; mi enfoque no es "totalmente equivocado". Primero, lo que discuto es el mismo código que usarías install.php, y segundo hay otros casos de uso donde install.phpno es aplicable. Sí, install.phptiene uso, pero no se ocupa de los detalles ni de la panacea que implica que es.
MikeSchinkel
0

Echa un vistazo a este script de instalación. https://github.com/Pravdomil/WP-Quick-Install

Tomo sus ideas y algo de código y creo algo que probablemente esté buscando.

Las características son la base de datos de configuración, diferentes idiomas, crear usuarios, establecer configuraciones básicas del sitio, eliminar complementos y plantillas predeterminados, descargar instalar y activar complementos y temas, avatar predeterminado, enlaces permanentes, portada estática.

Siéntase libre de contribuir.

pravdomil
fuente