Сценарій ініціалізації для "стандартних" аспектів веб-сайту 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

Це про це (хоча я можу ідентифікувати більше, як потрапляю в нього.)

Знову ж таки, я шукаю код, який я можу просто скопіювати та змінити, щоб мені не довелося самостійно з'ясовувати всі ці деталі (що не важко, просто нудно і забирає багато часу) .

О ще одна річ, я повинен почати з цього зараз, тим швидше, тим краще! :-)


Чи можете ви пояснити це Create Menus for Custom Pages? Ви маєте на увазі окремі області меню на деяких сторінках чи що?
Рарст

Привіт @Rarst : мені потрібно створити три меню з елементами меню, які посилаються на користувацькі сторінки, які я додаю (моє використання "Користувальницьке" , мабуть, заплутане, я скину це слово і просто скажу "Сторінки" ). Мені потрібно додати три меню та пункти меню для кожного, де один із пунктів меню повинен мати посилання на сторінку входу.
MikeSchinkel

Навіщо видаляти плагін "Hello Dolly"? Я маю на увазі, я розумію, чому ви цього не хочете, але його присутність не впливає на роботу сайту, і якщо ви використовуєте функцію автоматичного оновлення, вона буде відновлена ​​щоразу, коли виходить нова версія.
Даг

2
Привіт @Doug : Чому видалити Hello Hello? Проста відповідь: клієнт цього не хоче. :)
MikeSchinkel

Відповіді:


20

Як я вже згадував, я збираюся розпочати роботу над цією потребою негайно, тому я просуваюся вперед. Зважаючи на те, що я їх збиваю, я подумав, що найкраще почати публікувати їх. Тим не менш, якщо хтось інший зможе / опублікує (деякі) частини, які я ще не зробив, я з радістю дозволю вам скопіювати все, що я зробив, ви ні, і обрати свою відповідь як найкращу відповідь. До цього часу я почну публікувати код.

Перша річ wp-load.php:

Оскільки ми створюємо окремий файл у корені веб-сайту для запуску ініціалізації, який буде використовуватися лише для "завантаження" сайту (я закликав моє /my-init.php), ми починаємо з включення /wp-load.phpдля завантаження функцій API WordPress:

<?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 / теми каталогів (тобто ім'я підкаталогу, /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':

/*
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()повернемо потрібний нам об'єкт або повернемо, nullякщо жодна публікація не відповідає слизу, ми можемо перевірити наявність та зробити пошук одночасно:

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

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

Далі ...

Я буду продовжувати додавати до цього, коли я з'ясую, поки я не закінчу чи поки хтось не допоможе.


Це дійсно корисно, будь-який шанс включити решту функціональних можливостей тут?
jjeaton

@jjeaton - Коротка відповідь: Так, але ... . Більш довга відповідь: Мине кілька днів, якщо не тиждень. Я зробив значну роботу над цією проблемою, оскільки я останній раз писав тут, але мій клієнт наполягає на завершенні проекту, а я позаду, тому ... якщо ви можете зачекати трохи, я опублікую його, як тільки зможу отримайте вільний час, щоб написати його. BTW, які аспекти вас найбільше цікавлять?
MikeSchinkel

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

4

Встановити бажані постійні посилання

Новий (дивовижний) тематичний проект, на який я натрапив на цьому тижні, сильно зосереджений на функціональності HTML5 / CSS3, має власний сценарій завантаження для створення деякого вмісту котлована, включення налаштувань постійної посилання, встановлення відносного корінця для встановлення сайту тощо. функції викликаються активацією теми. Проект називається Roots і код можна завантажити тут ; Я не беру кредит на цей код. Однак, ось код для автоматичного встановлення / року / посади як структури постійної посилання (а гачки активації нижче для глобального $ 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, тому ситуація стає мутною і плутається при застосуванні до коду.
Рідкий

Напевно, точно. Тим не менш, тут є дивовижний прогрес. Це чудовий дзвінок на вашу пропозицію, я був час або два блоки Stack Exchange, але ніколи не замислювався про наслідки ліцензування. Я відредагував свій код внизу, а решту коду легко отримати за посиланнями, які я надав. Дякую за пораду :)

3

Видалити привіт повідомлення (з коментарем)

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 : Дякую за коментар. Ах, ти взяв найпростіший ... ;-) Я щойно повертався, щоб написати це.
MikeSchinkel

@MikeSchinkel Що-небудь, про що ти зараз не пишеш? Було б марно зануритися в код меню (це страшно), щоб прийти з результатом і вважати, що це вже зроблено. :)
Rarst

Привіт @Rarst! Почати в кінці списку? (заздалегідь дякую.)
MikeSchinkel

Гаразд, я спробую впоратися з меню, але ніяких обіцянок. Цей код складний всередині (ціна очевидних цукерок та зручність використання), тому я не впевнений, що мої навички залежать від цього.
Рарст

Привіт @Rarst - Я майже все це працює, але це, ймовірно, буде ще 24 години або близько того, перш ніж я можу закінчити свою відповідь. Просто хотів повідомити вас, щоб ви не вбивали себе, намагаючись змусити його працювати. Дякую за зусилля.
MikeSchinkel

0

Якщо я добре це розумію, ви хочете, щоб це було вроджене встановлення - тоді я боюся, що ваш підхід абсолютно неправильний.

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

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

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


2
@Thomas Kapler - Дякую за вашу відповідь, але я прошу відрізнятись; мій підхід не є "абсолютно неправильним". По-перше, те, що я обговорюю, - це той самий код, який ви використовували б install.php, по-друге, є й інші випадки використання, де install.phpце не застосовується. Так, install.phpце є його використання, але воно не піклується про деталі, а також про панацею, яку ви маєте на увазі.
MikeSchinkel

0

Погляньте на цей сценарій встановлення. https://github.com/Pravdomil/WP-Quick-Install

Я беру ваші ідеї та код і створюю щось, що ви, ймовірно, шукаєте.

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

Не соромтеся робити внесок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.