MikeSchinkel
  • 0
Гуру

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

  • 0

Я собираюсь написать скрипт для новой установки 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

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

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

О, еще одно, я должен начать это сейчас, так что чем раньше, тем лучше! 🙂

Share
  1. Не могли бы вы прояснить это Create Menus for Custom Pages ? Вы имеете в виду отдельные области меню на некоторых страницах или что?

    • 0
    • Привет @Rarst : мне нужно создать три меню, каждое с пунктами меню, которые ссылаются на настраиваемые страницы, которые я буду добавлять (моё использование «Пользовательского», вероятно, сбивает с толку, я отброшу это слово и просто скажу «Страницы». ) Итак Мне нужно добавить три меню и пункта меню для каждого, где один из пунктов меню должен ссылаться на страницу входа.

      • 0
    • Зачем удалять плагин «Hello Dolly»? Я имею в виду, я понимаю, почему вы не хотите его там, но его наличие никак не влияет на работу сайта, а если вы используете функцию автоматического обновления, то оно будет восстанавливаться каждый раз при выходе новой версии.

      • 0
    • Привет @Doug : Зачем удалять Hello Dolly? Простой ответ: клиент не хочет этого. 🙂

      • 0
    • Это действительно полезно, есть ли шанс включить остальную часть функциональности здесь?

      • 0
    • @jjeaton — Краткий ответ: Да, но…. Более длинный ответ: это займет несколько дней, если не недель. Я проделал значительную работу над этой проблемой с тех пор, как писал здесь в последний раз, но мой клиент настаивает на завершении проекта, а я отстаю, так что… если вы можете немного подождать, я опубликую его, как только смогу. получить свободное время, чтобы написать его. Кстати, какие аспекты вас больше всего интересуют?

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

      • 0
    • О, есть планы продолжить работу над этим вопросом… Но, как и многие другие планы, они приостановлены. 🙂 Хочу заметить, что лучше давать ссылки на необразовательные обширные сторонние фрагменты кода, а не размещать тему здесь. Этот сайт размещает пользовательские материалы под лицензией cc-wiki, поэтому ситуация становится туманной и запутанной при применении к коду.

      • 0
    • Наверняка, наверняка. Тем не менее, здесь есть огромный прогресс. Это отличный ответ на ваше предложение, я пару раз был в блоке Stack Exchange, но никогда не думал о последствиях лицензирования. Я отредактировал свой код, а остальную часть кода легко получить по ссылкам, которые я предоставил. Спасибо за подсказку 🙂

      • 0
    • Привет @Rarst : Спасибо за комментарий. Ах, ты выбрал легкий вариант… 😉 Я как раз возвращался, чтобы написать его.

      • 0
    • @MikeSchinkel Что-нибудь, чего ты не пишешь прямо сейчас? Было бы напрасно копаться в коде меню (это страшно), чтобы получить результат и обнаружить, что он уже сделан. 🙂

      • 0
    • Привет @Rarst! Начать с конца списка? (заранее спасибо.)

      • 0
    • Хорошо, я попытаюсь справиться с меню, но не обещаю. Этот код сложен внутри (цена глазного леденца и удобство использования), поэтому я не уверен, что мои навыки справятся с этим.

      • 0
    • Привет @Rarst — у меня почти все работает, но, вероятно, пройдет еще 24 часа или около того, прежде чем я смогу закончить свой ответ. Просто хотел, чтобы вы знали, чтобы вы не убили себя, пытаясь заставить его работать. Спасибо за попытку.

      • 0
    • @Thomas Kapler — Спасибо за ваш ответ, но я позволю себе не согласиться; мой подход не является «совершенно неправильным». Во-первых, я обсуждаю тот же код, который вы использовали бы в install.php, а во-вторых, есть другие варианты использования install.php, которые неприменимы. Да, install.php это полезно, но оно не заботится о деталях и не является панацеей, как вы подразумеваете.

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

    Первое: Включите 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 в качестве родительской темы, и вы назвали ее «Моя пользовательская тема» и поместили ее в /wp-content/themes/my-custom-theme каталог, вы должны активировать свою тему с помощью этого вызова:

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

    Но что, если это не дочерняя тема? Это легко, просто передайте слаг каталога/идентификатор темы (т.е. имя подкаталога, в /wp-content/themes котором находится ваша тема) в качестве обоих параметров. Предполагая, что вы хотите активировать тему Thematic от 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»

    Далее мы хотим удалить запись «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);
    

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

    Следующий…

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

    • 0
  3. Установите желаемые постоянные ссылки

    Новый (потрясающий) тематический проект, с которым я столкнулся на этой неделе, в значительной степени ориентирован на функциональность HTML5/CSS3, имеет собственный скрипт «bootstrap» для создания некоторого шаблонного контента, включения настроек постоянных ссылок, установки относительного корня для установки сайта и т. д. функции вызываются при активации темы. Проект называется 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(); 
    
    
        }
    

    ?>

    • 0
  4. Удалить сообщение Hello (с комментарием)

    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 );
    }
    
    • 0
  5. Если я хорошо это понимаю, вы хотите его для первоначальной установки — тогда я боюсь, что ваш подход совершенно неверен.

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

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

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

    • 0
  6. Посмотрите на этот скрипт установки. https://github.com/Pravdomil/WP-Быстрая установка

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

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

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

    • 0

Оставить ответ

You must login to add an answer.