워드 프레스 웹 사이트의“표준”측면에 대한 초기화 스크립트?


23

WordPress 3.0.1을 새로 설치하고 웹 사이트의 모든 초기 기능을 추가하려면 스크립트 를 작성해야합니다 . 유사한 웹 사이트를 많이 설치하고 구성 및 데이터의 표준 시작점이 필요한 회사를위한 것입니다.

  • 다른 사람이 이미이 작업을 수행했는지, 그렇다면 코드를 공유 할 수 있는지 궁금합니다.

나는 새로운 사이트를 만들 때 마다이 스크립트를 조정 하여 하드 코딩이 훌륭 하지만 결국 (충분히 경험 한 후에) 플러그인으로 변환하고 싶습니다.

여기에 작업의 기본 목록입니다 우리가 필요할 것 같은데요 (이 내가 워드 프레스 이미 설치 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 September

안녕하세요 @Rarst : 추가 할 사용자 정의 페이지에 연결되는 메뉴 항목으로 세 개의 메뉴를 만들어야합니다 ( "사용자 정의"의 사용 은 혼란 스럽습니다. 해당 단어를 삭제하고 "페이지" ) . 메뉴 항목 중 하나가 로그인 페이지에 링크되어야하는 곳에 각각 3 개의 메뉴와 메뉴 항목을 추가해야합니다.
MikeSchinkel

"Hello Dolly"플러그인을 삭제하는 이유는 무엇입니까? 나는 왜 당신이 그것을 원하지 않는지 이해하지만 그 존재는 사이트 운영에 영향을 미치지 않으며 자동 업그레이드 기능을 사용하면 새 버전이 출시 될 때마다 복원됩니다.
Doug

2
안녕하세요 @Doug : Hello Dolly를 삭제하는 이유는 무엇입니까? 간단한 대답 : 고객은 그것을 원하지 않습니다. :)
MikeSchinkel

답변:


20

내가 언급했듯이 나는이 필요성에 대해 즉시 작업을 시작할 것이기 때문에 앞으로 나아갈 것입니다. 내가 이것을 쓰러 뜨리고 있다고 생각하면 게시를 시작하는 것이 가장 좋습니다. 그래도 다른 사람이 내가하지 않은 부분을 게시하거나 게시 할 수있는 경우에는 내가하지 않은 내용을 복사하여 답변을 최선의 답변으로 선택하게되어 기쁩니다. 그때까지 코드 게시를 시작하겠습니다.

첫번째 것 : 포함 wp-load.php:

우리는 단지 사이트 "부트 스트랩"에 사용되는 실행 초기에 웹 사이트의 루트에서 독립 실행 파일을 만드는 때문에 (난 내 전화 /my-init.php) 우리는 포함하여 시작 /wp-load.php워드 프레스 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" 플러그인 을 삭제하려면 ( 죄송합니다. Matt )delete_plugins()기능을 사용합니다 . 디렉토리에 delete_plugins()상대적인 파일 경로 배열을 예상합니다 /wp-content/includes/. 를 들어 헬로 돌리 파일 경로 플러그인 단순히 hello.php이후 헬로 돌리 플러그인이 자신의 디렉토리에 저장되지 않고 대부분의 플러그인에 대한이의 형태로 될 것입니다 {$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()때문에 아마 파일 사용 권한 또는 플러그인이 현재 활성화되어있는 사실이나 먼저 해결해야하지만, 우리의 사용 사례에 대한 몇 가지 다른 이유로 실패합니다 안녕하세요 돌리 싸움없이 사라집니다.

리포지토리 플러그인 다운로드, 설치 및 활성화

사실 지금 저장소에서 다운로드 플러그인 할 필요가 없습니다 (나는 그냥이 할 수있는 좋을 것이다 생각했다) 우리는이 요구 사항 슬라이드를하자 나중에 다시 방문 할 것입니다.

플러그인 활성화

다음은 자체 사용자 정의 플러그인을 활성화하는 것입니다. 우리는 이미 플러그인 디렉토리에 그것들을 업로드했다고 가정 하고 WordPress를 위해 그것들을 활성화 해야합니다. ( 참고 :이 기술은 리포지토리 플러그인 활성화에도 적용되며, 먼저 다운로드하여 설치하지는 않습니다.)

우리는 activate_plugin()like delete_plugins()/wp-admin/includes/plugin.php포함 되어야 하는 기능을 사용할 것입니다. 그러나 활성화를 자동화하지 않고 삭제 하지 않는/wp-admin/includes/file.php 경우에는 필요 하지 않습니다 .

우리는 다시 존재 여부를 테스트하고 (없는 경우 활성화 할 필요가 없습니까?)is_plugin_active() 플러그인을 아직 활성화하지 않은 기능을 사용하여 확인합니다 . 참고 이번에 는 플러그인 식별자가 여러 번 중복되는 것을 막기 위해 이번에는 ( $plugin_filepath$plugin_dir) 변수를 몇 개 사용했습니다 .

다음 예제 my-custom-plugin.phpmy-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) : 파라미터 템플릿스타일 시트 . 글쎄, 적어도 그게 매개 변수의 이름입니다. Parent ThemeChild Theme 용어에 더 익숙 할 것 입니다.

부모 테마 인 WordPress와 함께 제공되는 기본 TwentyTen 테마 로 하위 테마 를 작성하고 이를 "내 사용자 정의 테마"라고 하고이를 디렉토리에 배치했다고 가정 하면 다음 호출을 사용하여 테마를 활성화합니다./wp-content/themes/my-custom-theme

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

그러나 어린이 테마가 아닌 경우 어떻게해야합니까? 쉽게 그건 그냥 통과 디렉토리 슬러그 / 테마 식별자 (즉,의 하위 디렉토리 오프의 이름 /wp-content/themes그 테마 포함) 모두 매개 변수로합니다. 당신이 활성화 할 가정 주제별 테마이안 D 스튜어트 당신이 한 통화 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()기능 예상하는이 전달되는 이름 아동 테마의 NOT 그것의 디렉토리 슬러그 / 테마 식별자. (이름은 테마 style.css파일 의 헤더에있는 "Theme Name :"섹션에 있습니다. 다행히도 get_current_theme()함수도 이름을 반환합니다.)

style.cssWordPress 기본 테마 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것이므로 그렇게하는 방법을 찾기로 결정했습니다. 약간의 spelunking 후 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 - 짧은 답변 : 네,하지만 ... . 더 긴 대답 : 몇 주가 아니라면 며칠이 될 것입니다. 여기에 마지막으로 쓴 이후 로이 문제에 대한 중요한 작업을 수행했지만 클라이언트가 프로젝트를 끝내고 Im을 뒤로 밀고 있기 때문에 가능한 한 빨리 게시 할 때까지 조금만 기다릴 수 있다면 그것을 쓸 자유 시간을 얻으십시오. BTW, 가장 관심있는 부분은 무엇입니까?
MikeSchinkel

물론, 서두르지 않습니다. 나는이 질문이 정말로 가치 있다고 생각하고 전체 솔루션을보고 싶었습니다. 여러 WordPress 사이트를 운영하고 있으며 항상 반복적 인 유지 관리 (플러그인 업데이트, 업그레이드 등) 작업을 자동화 할 수있는 방법을 찾고 있습니다.
jjeaton

4

원하는 퍼머 링크 설정

이번 주에 HTML5 / CSS3 기능에 중점을 둔 새로운 테마 프로젝트에는 보일러 플레이트 컨텐츠를 만들고, 퍼머 링크 설정을 통합하고, 사이트 설치를위한 상대 루트를 설정하는 등의 '부트 스트랩'스크립트가 있습니다. 테마 활성화시 기능이 호출됩니다. 프로젝트는 Roots 라고 하며 코드는 여기에서 다운로드 할 수 있습니다 . 이 코드에 대한 크레딧은 없습니다. 즉, 여기에 permalink 구조로 / 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

물론 이죠 그럼에도 불구하고 여기서 놀라운 발전이 있습니다. 그것은 당신의 제안에 큰 호소입니다. 스택 교환 블록 주위에 한두 번 있었지만 라이센싱의 영향에 대해서는 생각하지 않았습니다. 내 코드를 편집했으며 제공된 코드에서 나머지 코드를 쉽게 얻을 수 있습니다. 팁 주셔서 감사합니다 :)

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 : 댓글 주셔서 감사합니다. 아, 당신은 쉬운 하나를 가져 갔다 ... ;-) 난 그냥 그 하나를 작성하기 위해 돌아오고 있었다.
MikeSchinkel

@MikeSchinkel 지금 쓰고 있지 않은 것이 있습니까? 메뉴 코드로 들어가면 결과가 나오고 이미 끝난다는 것을 알면 낭비입니다. :)
Rarst

안녕 @Rarst! 목록의 끝에서 시작 하시겠습니까? (미리 감사드립니다.)
MikeSchinkel

좋아, 메뉴를 처리하려고하지만 약속은 없습니다. 그 코드는 내부에서 복잡하기 때문에 (아이 캔디 가격과 유용성) 내 기술이 그것에 달려 있다고 확신하지 않습니다.
Rarst

Hey @Rarst- 거의 다 작동했지만 대답을 마치려면 24 시간 정도 더 걸릴 것입니다. 당신이 그것을 작동 시키려고 노력하는 자신을 죽이지 않도록 알려주십시오. 노력해 주셔서 감사합니다.
MikeSchinkel

0

내가 그것을 잘 이해한다면, 당신은 초기 설치를 위해 그것을 원합니다-그렇다면 나는 당신의 접근법이 완전히 잘못되었다는 것을 두려워합니다.

훨씬 더 쉽고, 쉽고, 표준화 된 방법은 install.php를 만들어 wp-content 폴더에 저장하는 것입니다. 설치하는 동안 자동으로로드됩니다.

거기에 자신의 wp_install 함수를 넣을 수 있습니다 (wordpress 자체 함수가 if (! function_exist) 사용). 따라서 옵션을 쉽게 설정하고 플러그인을 활성화하며 초기 게시물, 카테고리, 태그, 사용자를 채울 수 있습니다 ...

두 번째 옵션은 모든 기존 wp를 지우려는 상황 (예 : cron을 사용하여 30 분마다 설정된 데모 버전의 경우)-a) 데이터베이스를 자르고 위의 절차를 사용하거나 플러그인을 만드는 같은.


2
@Thomas Kapler-답변 해 주셔서 감사합니다. 나의 접근 방식은 "완전히 틀렸다". 첫째,에서 논의 할 내용은에서 사용하는 것과 동일한 코드 install.php이며, 둘째로 install.php적용 할 수없는 다른 사용 사례 가 있습니다. 그렇습니다. install.php사용하고 있지만 세부 사항을 관리하지도 않고 당신이 그것을 의미하는 만병 통치약도 아닙니다.
MikeSchinkel

0

이 설치 스크립트를 살펴보십시오. https://github.com/Pravdomil/WP-Quick-Install

나는 당신의 아이디어와 코드를 취하고 아마도 당신이 찾고있는 것을 만듭니다.

기능은 데이터베이스 설정, 다른 언어, 사용자 생성, 기본 사이트 설정 설정, 기본 플러그인 및 템플릿 삭제, 플러그인 및 테마 설치 및 활성화, 기본 아바타, 영구 링크, 정적 프론트 페이지입니다.

자유롭게 기여하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.