WordPress Webサイトの「標準」アスペクトの初期化スクリプト?


23

私が書かなければならないのに約午前新鮮なワードプレス3.0.1のインストールおよびアドインのウェブサイトのためのすべての初期の機能を取るためのスクリプトを。これは、同様のWebサイトを多数インストールする企業向けであり、構成とデータの標準的な開始点が必要です。

  • 他の誰かがこれをすでに行っているかどうか、もしそうなら彼らがコードを共有できるかどうか疑問に思っていますか?

新しいスクリプトを作成するたびにこのスクリプトを微調整するので、ハードコーディングは問題ありませんが、最終的に(十分な経験を経て)プラグインに変換したいと思います。

私が必要だと思うタスクの基本リストは次のとおりです(これらは、すでにインストールされている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

これで終わりです(ただし、詳しく説明するかもしれませんが)。

繰り返しますが、コピーして変更できるコードを探しているので、これらすべての詳細を自分で理解する必要はありません(これは難しくなく、退屈で時間がかかります)

もう1つ、今すぐこれから始めなければならないので、早ければ早いほど良いです!:-)


これを明確にできますCreate Menus for Custom Pagesか?一部のページの個々のメニュー領域を意味しますか?
ラスト

こんにちは@Rarst:追加するカスタムページにリンクするメニュー項目を含む3つのメニューを作成する必要があります(「カスタム」の使用はおそらく混乱を招くので、その単語を削除して「ページ」と言いますメニュー項目の1つがログインページにリンクする必要があるそれぞれについて、3つのメニューとメニュー項目を追加する必要があります。
MikeSchinkel

「Hello Dolly」プラグインを削除する理由 つまり、なぜそこに配置したくないのかは理解できますが、その存在はサイトの運用に影響を与えず、自動アップグレード機能を使用すると、新しいバージョンがリリースされるたびに復元されます。
ダグ

2
こんにちは@Doug:なぜHello Dollyを削除するのですか?簡単な答え:クライアントはそれを望んでいません。:)
MikeSchinkel

回答:


20

私が述べたように、私はすぐにこの必要性に取り組み始めるつもりだったので、私は前進しています。これらをノックダウンしていることを考えると、投稿を開始するのが最善だと考えました。それでも、他の誰かが私がやったことのない部分(の一部)を投稿できる場合は、私がやったことは何でもコピーして、あなたの答えを最良の答えとして選択させていただきます。それまでは、コードの投稿を開始します。

最初のもの:含めるwp-load.php

我々は唯一のサイト「ブートストラップ」に使用される実行初期にWebサイトのルートにスタンドアロンファイルを作成しているので、(私は鉱山と呼ばれる/my-init.php我々は、以下を含むことから始める/wp-load.phpWordPressのAPI関数をロードします:

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

サイトのユーザーを作成する

にあるwp_insert_user()関数/wp-includes/registration.phpを使用してユーザーを作成します。このファイルはデフォルトではロードされないため、を呼び出して自分でロードする必要がありますrequire_once()

また、このget_user_by()関数を使用して、ユーザーが既に作成されているかどうかを最初に確認します。コードを2回実行する必要はありません。注:これはパターンに従います。たとえば、特にユーザーが初期化する予定の項目のデータを追加または変更した後、複数回呼び出された場合、スクリプトは何も複製または上書きしないでください。

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_DIRconstantと組み合わせて使用し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()あるような機能を使用しますが、削除ではなくアクティベーションを自動化するだけでよい場合必要ありません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);

好みのテーマを有効にする

テーマの有効化は、プラグインを削除または有効化するよりも比較的簡単です。必要なのは、1つの関数呼び出しだけですswitch_theme()switch_theme()関数は、二つの受け入れ(2) :パラメータテンプレートスタイルシートを。まあ、少なくともそれがパラメータの名前です。「親テーマ」および「子テーマ」という用語について詳しく知っているかもしれません。

親テーマであるWordPressに付属するデフォルトのTwentyTenテーマで子テーマを作成し、それを「My Custom Theme」と呼び、ディレクトリに配置したと仮定すると、この呼び出しを使用してテーマをアクティブにします。/wp-content/themes/my-custom-theme

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

しかし、それが子テーマではない場合はどうでしょうか?両方のパラメーターとして、ディレクトリスラッグ/テーマ識別子 (つまり、/wp-content/themesテーマを含むサブディレクトリの名前)を渡すだけです。Ian D StewartによるThematicテーマをアクティブにしたい場合、次のように呼び出します。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.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()まさに必要な関数の使用方法を示してくれたことにお気づきかもしれません。彼が説明したように、2番目のパラメーターは投稿をゴミ箱に移動するのではなく、完全に削除します$post->ID。最初のパラメーターはです。

もちろん、スラッグの代わりにスラッグを指定できるといい$post->IDので、それを行う方法を見つけることにしました。いくつかのスペルチェックの後、WordPressには残念ながら名前の付いた関数がget_page_by_path()あり、実際にスラッグで任意の投稿タイプを検索できることがわかりました(残念ながら、それ以外の投稿タイプで動作するものを見つけようとすると見落とす可能性があるため、名前が付けられています'page')。

get_page_by_path()WordPressで定義された定数を渡す ためOBJECT、postオブジェクトの形式で投稿が返されます。渡さ'post'れた3番目のパラメーターでは、の投稿タイプをルックアップすることを示しました'post'。以来get_page_by_path()ポスト我々が必要とするオブジェクトまたはリターンを返します。null何のポストは、我々が存在するかどうかを確認し、同時に検索を行うことができますスラグと一致しない場合:

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

注:データベース内のすべての投稿を削除するコードを実行することもできますが、保持したい投稿を追加すると、このコードを再度実行できなくなり、それが設計上の制約の1つでした。

次...

完了するまで、または他の誰かが手伝うまで、これを追加し続けます。


これは本当に役に立ちます。残りの機能をここに含める可能性はありますか?
ジートン

@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ライセンスの下に置いているため、コードに適用すると状況がぼやけて混乱します。
11

確かに、確かに。それにもかかわらず、ここには驚くべき進歩があります。それはあなたの提案への素晴らしい呼びかけです。私はスタックエクスチェンジブロックを1、2回見てきましたが、ライセンスの影響については考えませんでした。コードを編集しましたが、残りのコードは提供したリンクから簡単に入手できます。ヒントをありがとう:)

3

Hello Postを削除(コメント付き)

wp_delete_post( 1, true );

wp_delete_post()ドキュメントから直接。2番目のパラメーターは、ゴミ箱に移動するのではなく、完全に破棄します。

メニューを作成する

これにより、新しいメニューが作成され、既存のすべてのページがアイテムとして追加されます。それが完全に正しいかどうかはわかりません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!リストの最後から始めますか?(事前に感謝します。)
マイクシンケル

[OK]を、私はメニューを処理しようとしますが、約束はありません。そのコードは内部では複雑であるため(見た目の良さと使いやすさの価格)、自分のスキルがそれにかかっているとは確信できません。
ラースト

やあ@Rarst-私はそれがほとんどすべてうまくいったが、おそらく答えを終えるまでにさらに24時間かそこらになるだろう。あなたがそれを機能させようとして自殺しないように、あなたに知らせたかっただけです。努力してくれてありがとう。
MikeSchinkel

0

私がそれをよく理解しているなら、あなたは初期インストールのためにそれを望んでいます-あなたのアプローチが完全に間違っているのではないかと思います。

はるかに優れた、簡単で標準化された方法は、install.phpを作成してwp-contentフォルダーに入れることです。インストール中に自動的にロードされます。

そこで、独自のwp_install関数を(wordpress自身の関数がif(!function_exist)を使用するように)配置できるので、そこにオプションを簡単にセットアップし、プラグインをアクティブにし、最初の投稿、カテゴリー、タグ、ユーザーを入力できます

2番目のオプションは、既存の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.