Tập lệnh khởi tạo cho các tiêu chuẩn về khía cạnh của các trang web WordPress?


23

Tôi sắp phải viết một tập lệnh để cài đặt WordPress 3.0.1 mới và bổ sung tất cả các tính năng ban đầu cho một trang web . Đây là một công ty cài đặt rất nhiều trang web tương tự và họ cần một điểm khởi đầu chuẩn trong cấu hình và dữ liệu.

  • Tôi tự hỏi nếu có ai khác đã làm điều này và nếu vậy nếu họ có thể chia sẻ mã của họ?

Tôi hình dung chúng tôi sẽ điều chỉnh tập lệnh này mỗi lần họ tạo một trang web mới để mã hóa cứng là tốt mặc dù cuối cùng (sau khi có đủ kinh nghiệm) tôi muốn chuyển đổi thành một plugin.

Đây là danh sách các tác vụ cơ bản mà tôi nghĩ chúng ta sẽ cần (những giả định này tôi đã bắt đầu với WordPress 3.0.1 đã được cài đặt và các plugin và chủ đề tùy chỉnh của tôi được sao chép vào các thư mục phù hợp) :

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

Đó là về nó (mặc dù tôi có thể xác định nhiều hơn khi tôi vào nó.)

Một lần nữa, tôi đang tìm mã mà tôi chỉ có thể sao chép và sửa đổi để tôi không phải tự mình tìm ra tất cả các chi tiết này (điều này không khó, chỉ tẻ nhạt và tốn thời gian) .

Ồ thêm một điều nữa, tôi phải bắt đầu ngay bây giờ để càng sớm càng tốt! :-)


Bạn có thể làm rõ điều này Create Menus for Custom Pages? Bạn có nghĩa là khu vực menu cá nhân trên một số trang hoặc những gì?
Rarst

Hi @Rarst : Tôi cần phải tạo ra ba menuseach với các mục menu liên kết đến các trang Tuỳ tôi sẽ bổ sung thêm (sử dụng của tôi về "Custom" có lẽ là khó hiểu, tôi sẽ thả từ đó và chỉ nói "Trang". ) Vì vậy, Tôi cần thêm ba menu và các mục menu cho mỗi mục trong đó một trong các mục menu cần liên kết đến trang đăng nhập.
MikeSchinkel

Tại sao lại xóa plugin "Hello Dolly"? Ý tôi là, tôi hiểu tại sao bạn không muốn nó ở đó, nhưng sự hiện diện của nó không ảnh hưởng đến hoạt động của trang web và nếu bạn sử dụng chức năng nâng cấp tự động, nó sẽ được khôi phục mỗi khi phiên bản mới được phát hành.
Doug

2
Xin chào @Doug : Tại sao xóa Hello Dolly? Câu trả lời đơn giản: Khách hàng không muốn nó ở đó. :)
MikeSchinkel

Câu trả lời:


20

Như tôi đã đề cập, tôi sẽ bắt đầu thực hiện nhu cầu này ngay lập tức vì vậy tôi đang tiến hành. Cho rằng tôi đánh gục chúng, tôi nghĩ rằng tốt nhất là bắt đầu đăng chúng. Tuy nhiên, nếu người khác có thể / sẽ đăng (một số) những phần tôi chưa thực hiện, tôi sẽ vui lòng cho phép bạn sao chép bất cứ điều gì tôi đã làm và chọn câu trả lời của bạn là câu trả lời hay nhất. Cho đến lúc đó tôi sẽ bắt đầu đăng mã.

Điều đầu tiên: Bao gồm wp-load.php:

Vì chúng tôi đang tạo một tệp độc lập trong thư mục gốc của trang web để chạy khởi tạo sẽ chỉ được sử dụng để "bootstrap" một trang web (tôi gọi là của tôi /my-init.php), chúng tôi bắt đầu bằng cách /wp-load.phptải các hàm API của WordPress:

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

Tạo người dùng cho trang web

Chúng tôi sẽ sử dụng wp_insert_user()chức năng nằm trong /wp-includes/registration.phpđể tạo người dùng của chúng tôi. Tệp này không được tải theo mặc định, vì vậy chúng tôi sẽ phải tự tải nó bằng một cuộc gọi đến require_once().

Chúng tôi cũng sẽ sử dụng get_user_by()chức năng này trước tiên để xem người dùng đã được tạo chưa; không cần chạy mã hai lần nếu họ không có. LƯU Ý: Đây là một mô hình sẽ theo sau; ví dụ: tập lệnh của chúng tôi không được sao chép hoặc ghi đè lên bất cứ điều gì nếu được gọi nhiều lần, đặc biệt là sau khi người dùng đã thêm hoặc thay đổi dữ liệu cho bất kỳ mục nào chúng tôi dự định khởi tạo.

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

Xóa Plugin "Hello Dolly"

Để xóa plugin "Hello Dolly" ( xin lỗi Matt ) chúng tôi sẽ sử dụng delete_plugins()chức năng này. delete_plugins()mong đợi một mảng các đường dẫn tệp có liên quan đến /wp-content/includes/thư mục. Đối với plugin Hello Dolly , đường dẫn tệp chỉ đơn giản hello.phpvì plugin Hello Dolly không được lưu trong thư mục riêng của nó nhưng đối với hầu hết các plugin, nó sẽ ở dạng {$subdir}\{$filename}.php; tức là đường dẫn tệp cho Akismet là akismet/akismet.php.

Tuy nhiên, delete_plugins()không có sẵn cho đến khi chúng tôi đã bao gồm /wp-admin/includes/plugin.phpvà đó cũng là một sự phụ thuộc với wp-admin/includes/file.phpvì vậy chúng tôi require_once()cả trong những trước khi chúng tôi gọi delete_plugins(). Cuối cùng, chúng tôi sử dụng WP_PLUGIN_DIRhằng số kết hợp với file_exists()để xem liệu tệp plugin chính có tồn tại trước khi chúng tôi cố gắng xóa nó không ( điều đó không quan trọng nếu chúng tôi cố gắng xóa một tệp bị thiếu, nhưng thực sự thanh lịch hơn để kiểm tra trước và bạn có thể cần biết làm thế nào vì một số lý do khác) :

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

Lưu ý rằng đôi khi delete_plugins()sẽ thất bại vì quyền truy cập tệp hoặc có thể thực tế là một plugin hiện đang được kích hoạt hoặc một số lý do khác mà trước tiên bạn cần giải quyết nhưng vì trường hợp sử dụng của chúng tôi, Hello Dolly sẽ biến mất mà không cần chiến đấu.

Tải xuống, cài đặt và kích hoạt các plugin lưu trữ

Tôi thực sự không cần phải tải xuống các plugin từ kho lưu trữ ngay bây giờ (tôi đã nghĩ rằng nó sẽ rất tốt để có) chúng tôi sẽ để yêu cầu này trượt và xem lại nó sau.

Kích hoạt Plugin của bạn

Tiếp theo là kích hoạt các plugin tùy chỉnh của chúng ta. Chúng tôi giả định rằng chúng tôi đã tải chúng lên thư mục plugin và tất cả những gì chúng tôi cần để kích hoạt chúng cho WordPress. ( Lưu ý : Kỹ thuật này cũng sẽ hoạt động để kích hoạt các plugin kho lưu trữ, nó sẽ không tải xuống và cài đặt chúng trước.)

Chúng tôi sẽ sử dụng activate_plugin()chức năng giống như delete_plugins()yêu cầu /wp-admin/includes/plugin.phpđược đưa vào nhưng không cần /wp-admin/includes/file.phptrong trường hợp bạn chỉ cần tự động hóa kích hoạt và không xóa.

Chúng tôi sẽ kiểm tra lại sự tồn tại (không cần kích hoạt nếu không có, eh?) Và chúng tôi cũng sẽ xác minh bằng cách sử dụng is_plugin_active()chức năng mà plugin chưa được kích hoạt. Lưu ý tôi đã sử dụng một vài biến số lần này ( $plugin_filepath$plugin_dir) để tránh trùng lặp định danh plugin nhiều lần.

Ví dụ của chúng tôi sau đây kích hoạt plugin my-custom-plugin.phpnằm trong my-custom-pluginthư mục con:

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

Kích hoạt chủ đề ưa thích của bạn

Kích hoạt một chủ đề dễ dàng hơn một chút so với việc xóa hoặc kích hoạt một plugin, nói một cách tương đối; một cuộc gọi chức năng là tất cả những gì được yêu cầu : switch_theme(). Các switch_theme()chức năng chấp nhận hai (2) tham số: templatestylesheet . Chà, ít nhất đó là những gì các tham số được đặt tên. Bạn có thể quen thuộc hơn với các thuật ngữ Chủ đề phụ huynhChủ đề trẻ em .

Giả sử bạn đã tạo Chủ đề con với chủ đề TwentyTen mặc định đi kèm với WordPress là Chủ đề phụ huynh và bạn đã gọi nó là "Chủ đề tùy chỉnh của tôi" và đặt nó vào /wp-content/themes/my-custom-themethư mục, bạn sẽ kích hoạt chủ đề của mình bằng cuộc gọi này:

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

Nhưng nếu nó không phải là một chủ đề trẻ em thì sao? Điều đó thật dễ dàng, chỉ cần vượt qua trình nhận dạng slug / theme của thư mục (tức là tên của thư mục con trong /wp-content/themesđó có chủ đề của bạn) làm cả hai tham số. Giả sử bạn muốn kích hoạt chủ đề Chuyên đề của Ian D Stewart, bạn đã gọi switch_theme()như vậy:

switch_theme('thematic', 'thematic');

Cá nhân tôi nghĩ rằng sẽ hơi phiền khi phải theo dõi cả hai chi tiết ở đây vì vậy tôi đã viết một hàm gọi là activate_my_theme()kiểm tra đầu tiên để đảm bảo get_current_theme()chức năng đó và nếu không kích hoạt nó. Bạn chỉ cần nói với nó chủ đề con (còn gọi là "bản định kiểu") và nó tìm ra chủ đề gốc cho bạn (hay còn gọi là "mẫu") bằng cách lấy các chi tiết từ get_theme()hàm.

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

Một điểm quan trọng cần nhận thức ; các get_theme()dự đoán chức năng để được thông qua tên của child theme, KHÔNG nó nhận diện thư mục sên / chủ đề. (Tên xuất phát từ phần "Tên chủ đề:" trong tiêu đề của style.csstệp của chủ đề . May mắn là get_current_theme()chức năng cũng trả lại tên.)

Kiểm tra tiêu đề trong style.csstệp của chủ đề mặc định WordPress Twenty Ten chúng ta thấy tên của nó thực tế là '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
*/

Xóa "Hello World" bài viết

Tiếp theo chúng tôi muốn xóa bài "Hello World" . Bạn có thể đã thấy rằng @Rarst đã chỉ cho chúng ta cách sử dụng wp_delete_post()chức năng chính xác là những gì chúng ta cần. Như ông đã giải thích, tham số thứ hai sẽ xóa hoàn toàn bài đăng trái ngược với việc di chuyển nó vào thùng rác và tham số đầu tiên là $post->ID.

Tất nhiên sẽ rất tuyệt nếu có thể chỉ định sên thay vì $post->IDvà vì vậy tôi quyết định tìm cách để làm điều đó. Sau một vài lần chơi trò chơi, tôi thấy rằng WordPress có một chức năng không may được gọi là chức năng get_page_by_path()thực sự cho phép chúng tôi tìm kiếm bất kỳ loại bài đăng nào bằng sên của nó (nó không may được đặt tên vì bạn có thể bỏ qua nó khi cố gắng tìm thứ gì đó hoạt động với các loại bài đăng khác 'page'.)

Vì chúng ta vượt qua get_page_by_path()hằng số do WordPress định nghĩa, OBJECTnó sẽ trả lại cho chúng ta một bài đăng dưới dạng một đối tượng bài đăng. Đối với tham số thứ ba, chúng tôi đã thông qua 'post'để cho biết chúng tôi muốn nó tra cứu các loại bài đăng của 'post'. Vì get_page_by_path()sẽ trả về đối tượng bài đăng mà chúng ta cần hoặc trả lại nullnếu không có bài nào khớp với sên, chúng ta có thể kiểm tra sự tồn tại và thực hiện tra cứu cùng một lúc:

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

Lưu ý: Chúng tôi có thể đã chạy mã để xóa mọi bài đăng trong cơ sở dữ liệu nhưng nếu có, chúng tôi sẽ không thể chạy lại mã này một lần nữa khi chúng tôi đã thêm các bài đăng mà chúng tôi muốn giữ và đó là một trong những hạn chế thiết kế của chúng tôi.

Kế tiếp...

Tôi sẽ tiếp tục thêm vào điều này khi tôi tìm ra nó cho đến khi tôi hoàn thành hoặc cho đến khi có người khác giúp đỡ.


Điều này thực sự hữu ích, bất kỳ cơ hội bao gồm phần còn lại của chức năng ở đây?
jjeaton

@jjeaton - Câu trả lời ngắn: Có, nhưng ... . Câu trả lời dài hơn: Sẽ mất vài ngày nếu không phải vài tuần. Tôi đã thực hiện một công việc quan trọng về vấn đề này kể từ lần cuối tôi viết ở đây nhưng khách hàng của tôi đang cố gắng hoàn thành một dự án và tôi ở phía sau, vì vậy ... nếu bạn có thể đợi một chút trong khi tôi sẽ đăng nó ngay khi tôi có thể có thời gian rảnh để viết nó lên BTW, khía cạnh nào bạn quan tâm nhất?
MikeSchinkel

Tất nhiên, không vội vàng chút nào. Tôi đã nghĩ rằng câu hỏi này sẽ thực sự có giá trị và vì vậy muốn xem toàn bộ giải pháp. Tôi điều hành một số trang web WordPress và tôi luôn tìm cách tự động hóa việc bảo trì lặp đi lặp lại mà tôi phải thực hiện trên chúng (cập nhật plugin, nâng cấp, v.v.) vì vậy một số điều này thực sự có giá trị.
jjeaton

4

Đặt Permalinks mong muốn

Một dự án chủ đề mới (tuyệt vời) mà tôi đã bắt gặp trong tuần này tập trung nhiều vào chức năng HTML5 / CSS3 có tập lệnh 'bootstrap' của riêng nó để tạo một số nội dung soạn sẵn, kết hợp cài đặt permalink, đặt gốc tương đối cho cài đặt trang web, v.v. các tính năng được gọi là kích hoạt chủ đề. Dự án được gọi là Rễ và mã có thể được tải xuống ở đây ; Tôi không có tín dụng cho mã này. Điều đó nói rằng, đây là mã để tự động đặt / năm / postname dưới dạng cấu trúc permalink (và các móc kích hoạt bên dưới cho $ pagenow toàn cầu được giải thích tại đây: 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(); 


    }

?>


Ồ, có kế hoạch để tiếp tục làm việc với câu hỏi này ... Nhưng như nhiều kế hoạch khác họ đang bị trì hoãn. :) Tôi muốn lưu ý rằng tốt hơn là liên kết với các đoạn mã bên thứ ba rộng rãi không giáo dục, thay vì đăng chủ đề ở đây. Trang web này đặt đóng góp của người dùng theo giấy phép cc-wiki để tình hình trở nên âm u và bối rối khi áp dụng mã.
Rarst

Chắc chắn, chắc chắn. Có sự tiến bộ tuyệt vời ở đây dù sao. Đó là một lời kêu gọi tuyệt vời về đề xuất của bạn, tôi đã ở xung quanh khối Stack Exchange một hoặc hai lần nhưng chưa bao giờ nghĩ về ý nghĩa cấp phép. Tôi đã chỉnh sửa mã của mình xuống và phần còn lại của mã có thể dễ dàng lấy được tại các liên kết tôi cung cấp. Cảm ơn vì tiền boa :)

3

Xóa Hello Post (có bình luận)

wp_delete_post( 1, true );

Trực tiếp từ wp_delete_post()tài liệu. Tham số thứ hai loại bỏ nó hoàn toàn, thay vì chuyển sang thùng rác.

Tạo menu

Điều này tạo ra menu mới và thêm tất cả các trang hiện có dưới dạng các mục vào nó. Tôi không chắc chắn nó hoàn toàn chính xác, tôi không thể lấy các mục menu để hiển thị Pagenhãn trong số những thứ khác. Dù sao não tôi đang tan chảy nên tôi đang nghỉ ngơi. Có lẽ ai đó sẽ có thể nâng cấp điều này lên một cái gì đó đáng tin cậy hơn.

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

Xin chào @Rarst : Cảm ơn bạn đã bình luận. À, bạn đã lấy cái dễ dàng ... ;-) Tôi vừa trở lại để viết cái đó lên.
MikeSchinkel

@MikeSchinkel Bất cứ điều gì bạn không viết ngay bây giờ? Sẽ thật lãng phí khi đi sâu vào mã menu (thật đáng sợ) để đi kèm với kết quả và thấy nó đã được thực hiện. :)
Rarst

Xin chào @Rarst! Bắt đầu ở cuối danh sách? (cảm ơn trước.)
MikeSchinkel

Ok, tôi sẽ cố gắng xử lý Menu, nhưng không hứa hẹn. Mã đó là phức tạp bên trong (giá của kẹo mắt và khả năng sử dụng) vì vậy tôi không tự tin rằng các kỹ năng của tôi là tùy thuộc vào nó.
Rarst

Hey @Rarst - Tôi khá nhiều nhận nó tất cả làm việc nhưng nó có lẽ sẽ có thêm 24 giờ hoặc lâu hơn trước khi tôi có thể hoàn thành câu trả lời của tôi. Chỉ muốn cho bạn biết để bạn không tự giết mình khi cố gắng làm cho nó hoạt động. Cảm ơn cho những nỗ lực.
MikeSchinkel

0

Nếu tôi hiểu rõ về nó, bạn muốn nó cho sự bẩm sinh - thì tôi sợ cách tiếp cận của bạn là hoàn toàn sai.

Cách tốt hơn, dễ dàng hơn và được tiêu chuẩn hóa là tạo install.php và đặt nó vào thư mục nội dung wp - nó được tải tự động trong quá trình cài đặt.

Ở đó, bạn có thể đặt chức năng wp_install của riêng mình (vì chức năng của wordpress sử dụng if (! Function_exist)) để bạn có thể dễ dàng thiết lập các tùy chọn của mình, kích hoạt bổ trợ, điền vào bài viết ban đầu, danh mục, thẻ, người dùng ...

Tùy chọn thứ hai có thể dành cho tình huống, trong đó bạn muốn xóa wp đã có sẵn (ví dụ: đối với phiên bản demo được thiết lập cứ sau 30 phút sử dụng cron) - bạn có thể a) chấm dứt cơ sở dữ liệu và sử dụng quy trình ở trên hoặc tạo plugin thực hiện tương tự.


2
@Thomas Kapler - Cảm ơn câu trả lời của bạn nhưng tôi xin khác biệt; Cách tiếp cận của tôi không "hoàn toàn sai." Đầu tiên, những gì tôi thảo luận là cùng một mã mà bạn sẽ sử dụng install.phpvà thứ hai có các trường hợp sử dụng khác install.phpkhông áp dụng được. Vâng, install.phpnó đã được sử dụng nhưng nó không quan tâm đến các chi tiết cũng như thuốc chữa bách bệnh mà bạn ngụ ý.
MikeSchinkel

0

Có một cái nhìn vào kịch bản cài đặt này. https://github.com/Pravdomil/WP-Quick-Install

Tôi lấy ý tưởng của bạn và một số mã và tạo ra một cái gì đó mà bạn có thể đang tìm kiếm.

Các tính năng là cơ sở dữ liệu thiết lập, ngôn ngữ khác nhau, tạo người dùng, thiết lập cài đặt trang cơ bản, xóa plugin và mẫu mặc định, tải xuống cài đặt và kích hoạt plugin và chủ đề, avatar mặc định, permalinks, trang trước tĩnh.

Đã đóng góp miễn phí.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.