Сценарий инициализации для «стандартных» аспектов веб-сайта WordPress?

23

Я собираюсь написать скрипт для новой установки WordPress 3.0.1 и надстройки всех начальных функций для веб-сайта . Это для компании, которая устанавливает множество подобных веб-сайтов, и им нужна стандартная отправная точка в конфигурации и данных.

  • Мне интересно, если кто-то еще сделал это, и если да, могут ли они поделиться своим кодом?

Я предполагаю, что мы будем дорабатывать этот скрипт каждый раз, когда они создают новый сайт, так что жесткое кодирование хорошо, хотя в конце концов (после достаточного опыта) я хотел бы преобразовать в плагин.

Вот основной список задач, которые, я думаю, нам понадобятся (предполагается, что я начал с WordPress 3.0.1, который уже установлен, и мои пользовательские плагины и пользовательские темы скопированы в соответствующие каталоги) :

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

Вот и все (хотя я могу определить больше, когда я вхожу в это.)

Опять же, я ищу код, который я могу просто скопировать и изменить, чтобы мне не пришлось самостоятельно разбирать все эти детали (что не сложно, просто утомительно и требует много времени) .

О, еще одна вещь, я должен начать с этого сейчас, так что чем раньше, тем лучше! :-)

MikeSchinkel
источник
Не могли бы вы уточнить это Create Menus for Custom Pages? Вы имеете в виду отдельные области меню на некоторых страницах или что?
Первый
Привет @Rarst : Мне нужно создать три menuseach с пунктами меню, которые ссылаются на пользовательские страницы, которые я буду добавлять (мое использование "Custom" , вероятно, сбивает с толку, я опущу это слово и просто скажу "Pages." ) Мне нужно добавить три меню и пункты меню для каждого, где один из пунктов меню должен ссылаться на страницу входа.
Майк Шинкель
Зачем удалять плагин "Hello Dolly"? Я имею в виду, я понимаю, почему вы этого не хотите, но его наличие не влияет на работу сайта, и если вы используете функцию автоматического обновления, она будет восстанавливаться каждый раз, когда будет выпущена новая версия.
Дуг
2
Привет @Doug : Зачем удалять Hello Dolly? Простой ответ: клиент не хочет этого там. :)
MikeSchinkel

Ответы:

20

Как я уже говорил, я собирался немедленно начать работу над этой потребностью, поэтому я добиваюсь прогресса. Учитывая, что я сбиваю их, я решил, что лучше начать публиковать их. Тем не менее, если кто-то еще может / опубликует (некоторые из) части, которые я не сделал, я с радостью позволю вам скопировать все, что я не сделал, и не выбрал ваш ответ как лучший. А пока я начну публиковать код.

Первое, что включает wp-load.php:

Так как мы создаем автономный файл в корне веб-сайта для запуска инициализации, которая будет использоваться только для «начальной загрузки» сайта (я назвал мой /my-init.php), мы начинаем с включения /wp-load.phpзагрузки функций WordPress API:

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

Создание пользователей для сайта

Мы будем использовать эту wp_insert_user()функцию /wp-includes/registration.phpдля создания наших пользователей. Этот файл не загружается по умолчанию, поэтому мы должны загрузить его сами с помощью вызова require_once().

Мы также будем использовать get_user_by()функцию, чтобы сначала увидеть, был ли пользователь уже создан; нет необходимости запускать код дважды, если они этого не сделали. ПРИМЕЧАНИЕ: это шаблон будет следовать; например, наш скрипт не должен дублировать или перезаписывать что-либо, если он вызывается несколько раз, особенно после того, как пользователи добавили или изменили данные для любого из элементов, которые мы планируем инициализировать.

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

Удаление плагина "Hello Dolly"

Для удаления плагина «Hello Dolly» ( извините, Мэтт ) мы будем использовать delete_plugins()функцию. delete_plugins()ожидает массив путей к файлам относительно /wp-content/includes/каталога. Для плагина Hello Dolly путь к файлу просто, hello.phpтак как плагин Hello Dolly не хранится в своем собственном каталоге, но для большинства плагинов он будет в форме {$subdir}\{$filename}.php; т.е. путь к файлу для Akismet есть akismet/akismet.php.

Тем delete_plugins()не менее, он недоступен, пока мы его не включим, /wp-admin/includes/plugin.phpи есть также зависимость, wp-admin/includes/file.phpтак что мы require_once()оба из них, прежде чем мы позвоним delete_plugins(). Наконец, мы используем WP_PLUGIN_DIRконстанту вместе с, file_exists()чтобы увидеть, существует ли основной файл плагина до того, как мы попытаемся его удалить ( это не имеет значения, если бы мы попытались удалить отсутствующий файл, но на самом деле более элегантно сначала проверить, и вам может понадобиться узнать по какой-то другой причине) :

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

Обратите внимание, что иногда происходит delete_plugins()сбой из-за прав доступа к файлу или из-за того, что плагин в настоящее время активирован, или по какой-то другой причине, которую вам сначала нужно решить, но для нашего варианта использования Hello Dolly уходит без боя.

Загрузка, установка и активация плагинов репозитория

Мне на самом деле не нужно загружать плагины из репозитория прямо сейчас (я думал, что это было бы неплохо иметь), мы собираемся позволить этому требованию сдвинуться и вернуться к нему позже.

Активация ваших плагинов

Следующим шагом является активация наших собственных пользовательских плагинов. Мы предполагаем, что мы уже загрузили их в каталог плагинов, и все, что нам нужно сделать, это активировать их для WordPress. ( Примечание : этот метод будет работать и для активации плагинов репозитория, он просто не будет загружать и устанавливать их в первую очередь.)

Мы будем использовать activate_plugin()функцию, которая, как и delete_plugins()требуется, /wp-admin/includes/plugin.phpдолжна быть включена, но не нужна, /wp-admin/includes/file.phpесли вам нужно только автоматизировать активацию, а не удаление.

Мы снова проверим существование (не нужно активировать, если не там, а?), И мы также проверим, используя is_plugin_active()функцию, что плагин еще не был активирован. Обратите внимание, что на этот раз я использовал несколько переменных ( $plugin_filepathи $plugin_dir), чтобы избежать дублирования идентификатора плагина много раз.

Наш следующий пример активирует плагин, my-custom-plugin.phpкоторый находится в my-custom-pluginподкаталоге:

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

Активация предпочитаемой темы

Для сравнения, активировать тему немного проще, чем удалить или активировать плагин; один вызов функции это все , что требуется: switch_theme(). switch_theme()Функция принимает два (2) параметры: шаблон и таблицу стилей . Ну, по крайней мере, так названы параметры. Возможно, вы более знакомы с терминами « Родительская тема» и « Детская тема» .

Предполагая , что вы создали ребенок тему с темой TwentyTen по умолчанию , который поставляется с WordPress является Родитель Темой и вы назвали его «Мой заказ Theme» и поместили его в /wp-content/themes/my-custom-themeкаталог, вы активируете свою тему с помощью этого вызова:

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

Но что, если это не детская тема? Это просто, просто передайте в качестве обоих параметров идентификатор директории slug / theme (то есть имя подкаталога, в /wp-content/themesкотором содержится ваша тема) . Предполагая, что вы хотите активировать Тематическую тему от Ian D Stewart, вы называете switch_theme()так:

switch_theme('thematic', 'thematic');

Лично я считаю, что немного нелепо отслеживать обе детали, поэтому я написал функцию, activate_my_theme()которая сначала проверяет эту get_current_theme()функцию, а если нет, то активирует ее. Вам просто нужно сказать ей дочернюю тему (она же «таблица стилей»), и она выяснит для вас родительскую тему (она же «шаблон») , взяв детали из get_theme()функции.

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

Один ключевой момент, о котором нужно знать ; то get_theme()функция ожидает передачи на имя ребенка Тема, НЕ это каталог пробкового / тема идентификатора. (Имя взято из раздела «Имя темы:» в заголовке style.cssфайла темы . К счастью, get_current_theme()функция также возвращает имя.)

Изучив заголовок в style.cssфайле темы WordPress по умолчанию Twenty Ten, мы видим, что это имя на самом деле '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
*/

Удаление "Hello World" Post

Далее мы хотим удалить сообщение "Hello World" . Возможно, вы видели, что @Rarst показал нам, как использовать wp_delete_post()функцию, которая именно то, что нам нужно. Как он объяснил, второй параметр полностью удалит сообщение, а не перемещает его в корзину, а первый параметр - $post->ID.

Конечно, было бы неплохо иметь возможность указать слаг вместо вместо, $post->IDи поэтому я решил найти способ сделать это. После некоторой проверки я обнаружил, что WordPress имеет функцию с именем, к сожалению, с именем, get_page_by_path()которая на самом деле позволяет нам искать любой тип записи по его слагу (он, к сожалению, называется, потому что вы можете пропустить его, когда пытаетесь найти что-то, что работает с типами записей, отличными от 'page'.)

Поскольку мы передаем get_page_by_path()константу, определенную в WordPress, OBJECTона вернет нам сообщение в форме объекта сообщения. Для третьего параметра, который мы передали, 'post'чтобы указать, что мы хотим, чтобы он просматривал типы сообщений 'post'. Так get_page_by_path()как вернет нужный нам объект post или вернет, nullесли ни одно сообщение не соответствует слагу, мы можем проверить его существование и одновременно выполнить поиск:

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

Примечание. Мы могли бы запустить код для удаления каждого поста в базе данных, но если бы он был у нас, мы не смогли бы снова запустить этот код, как только мы добавим посты, которые мы хотим сохранить, и это было одним из наших ограничений дизайна.

Следующий...

Я продолжу добавлять к этому, как я понимаю это, пока я не закончу или пока кто-то еще не поможет.

MikeSchinkel
источник
Это действительно полезно, есть ли шанс включить остальные функции здесь?
jjeaton
@jjeaton - Короткий ответ: Да, но ... . Более длинный ответ: это будет несколько дней, если не недель. Я проделал значительную работу над этой проблемой с тех пор, как в последний раз писал здесь, но мой клиент настаивает на том, чтобы завершить проект, и я позади, так что ... если вы можете немного подождать, я опубликую его, как только смогу получите свободное время, чтобы написать это. Кстати, какие аспекты вас больше всего интересуют?
MikeSchinkel
конечно, не торопиться вообще. Я думал, что этот вопрос будет действительно ценным, и поэтому хотел увидеть полное решение. Я управляю несколькими сайтами WordPress и всегда ищу способы автоматизировать повторное обслуживание, которое я должен выполнять на них (обновления плагинов, обновления и т. Д.), Поэтому некоторые из них действительно полезны.
Джеатон
4

Установить желаемые постоянные ссылки

Новый (потрясающий) тематический проект, с которым я столкнулся на этой неделе и который в основном сфокусирован на функциональности HTML5 / CSS3, имеет собственный скрипт начальной загрузки для создания некоторого стандартного контента, включения параметров постоянной ссылки, установки относительного корня для установки сайта и т. Д. функции вызываются при активации темы. Проект называется Roots, и код можно скачать здесь ; Я не беру кредит на этот код. Тем не менее, вот код для автоматической установки / year / postname в качестве структуры постоянной ссылки (а ниже описаны крючки активации для глобального $ pagenow: 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(); 


    }

?>


источник
О, есть планы продолжить работу над этим вопросом ... Но, как и многие другие планы, они приостановлены. :) Хочу отметить, что лучше размещать ссылки на обширные фрагменты кода, не относящиеся к образованию, а не публиковать темы здесь. Этот сайт помещает вклады пользователей под лицензией cc-wiki, поэтому ситуация становится мутной и запутанной при применении к коду.
Rarst
Конечно, точно. Тем не менее, здесь есть огромный прогресс. Это хороший призыв к вашему предложению, я был в блоке Stack Exchange раз или два, но никогда не задумывался о последствиях лицензирования. Я отредактировал свой код, и остальную часть кода легко получить по предоставленным мною ссылкам. Спасибо за совет :)
3

Удалить Hello Post (с комментарием)

wp_delete_post( 1, true );

Прямо из wp_delete_post()документов. Второй параметр полностью уничтожает его, вместо того, чтобы переходить в мусорное ведро.

Создать меню

Это создаст новое меню и добавит в него все существующие страницы. Я не уверен, что это совершенно правильно, мне не удалось получить пункты меню, чтобы показать Pageярлык среди других вещей. Во всяком случае, мой мозг тает, поэтому я делаю перерыв. Может быть, кто-то сможет обновить это до чего-то более надежного.

$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
источник
Привет @Rarst : Спасибо за комментарий. Ах, ты взял легкий ... ;-) Я только что вернулся, чтобы написать это.
Майк Шинкель
@MikeSchinkel Что-нибудь, что ты сейчас не пишешь? Было бы бесполезно погружаться в код меню (это страшно), чтобы прийти к результату и обнаружить, что оно уже сделано. :)
Первый
Привет @Rarst! Начать в конце списка? (заранее спасибо.)
MikeSchinkel
Хорошо, я постараюсь справиться с меню, но без обещаний. Этот код сложен внутри (цена приятных глаз и удобство использования), поэтому я не уверен, что мои навыки соответствуют этому.
2010 г.,
Привет @Rarst - у меня все получилось, но, возможно, пройдет еще около 24 часов, прежде чем я смогу закончить свой ответ. Просто хотел, чтобы ты знал, чтобы ты не убивал себя, пытаясь заставить его работать. Спасибо за попытку.
MikeSchinkel
0

Если я хорошо понимаю, вы хотите, чтобы это было для первоначальной установки - тогда я боюсь, что ваш подход совершенно неверен.

Гораздо лучший, простой и стандартизированный способ - создать install.php и поместить его в папку wp-content - он автоматически загружается во время установки.

Там вы можете поместить свою собственную функцию wp_install (так как собственная функция wordpress использует if (! Function_exist)), чтобы вы могли легко настроить ваши параметры, активировать плагины, заполнить начальные сообщения, категории, теги, пользователей ...

Второй вариант может быть для ситуации, когда вы хотите очистить уже существующий wp (например, для демо-версии, установленной каждые, например, 30 минут, используя cron) - вы можете a) обрезать базу данных и использовать процедуру, описанную выше, или создать плагин, который выполняет одно и тоже.


источник
2
@ Томас Каплер - Спасибо за ваш ответ, но я позволю себе не согласиться; мой подход не "полностью неверен". Во-первых, то, что я обсуждаю, - это тот же код, в котором вы будете использовать install.php, а во-вторых, есть другие варианты использования, где install.phpэто не применимо. Да, install.phpон используется, но он не заботится о деталях и не является панацеей, которой вы предполагаете.
MikeSchinkel
0

Посмотрите на этот скрипт установки. https://github.com/Pravdomil/WP-Quick-Install

Я беру ваши идеи и некоторый код и создаю то, что вы, вероятно, ищете.

Возможности: настройка базы данных, разных языков, создание пользователей, установка основных настроек сайта, удаление плагинов и шаблонов по умолчанию, загрузка, установка и активация плагинов и тем, аватар по умолчанию, постоянные ссылки, статическая титульная страница.

Не стесняйтесь вносить свой вклад.

pravdomil
источник