doganteさん、spreadhappinessさん、こんにちは。
概ねspreadhappinessさんの理解で正しいです。ただ、他の方法も書いてしまったため、紛らわせてしまいました。
まずinitのタイミングですが、wp-settings.phpのほぼ最後に
// Everything is loaded and initialized.
do_action('init');
という記述あります。これが、initに登録されていたアクションフックが実行されるタイミングになります。ここのタイミングですが、コメントされているとおり全ての設定の読み込みと初期化が完了が完了した時になります。
つまりこの後にリクエストを元にして記事の取得が行われる訳です。
ここで、「ホーム」というタイトルを持つページのIDを探して、存在していたらget_option('show_on_front')、get_option('page_on_front')のフィルターフックを登録しておくのです。
function check_home_page() {
global $wpdb;
$home_id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_title = 'ホーム' AND post_type = 'page'" );
if ( $home_id ) {
add_filter( 'pre_option_show_on_front', 'set_page_show_on_front' ) );
add_filter( 'pre_option_page_on_front', 'set_home_page_on_front' ) );
}
}
※ get_page_by_titleは使いません。それは、この関数が上記同等のクエリーでIDを取得した後に、get_pageでページのデータを取得しているため、不要なクエリーが増えてしまうためです。
※ 公開ページのみの指定としたい場合は、上記のクエリーにAND post_status = 'publish'を追加する必要があります。
で、get_option('show_on_front')、get_option('page_on_front')のフィルターフックとして登録したset_page_show_on_frontとset_home_page_on_frontですが、下記のようになります。
function set_page_show_on_front( $pre ) {
return 'page';
}
function set_home_page_on_front( $pre ) {
return $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_title = 'ホーム' AND post_type = 'page'" );
}
で、最後にinitでcheck_home_pageが実行されるようフックの登録をしておきます。
add_action( 'init', 'check_home_page' );
これをテーマのfunctions.phpに記述して完了としたい所ですが、set_home_page_on_frontの実行内容が、check_home_pageの実行内容と一部同じで馬鹿っぽいですし、第一、データベースへのクエリーは時間コストが高いのでなるべく少なくしてしまいたいです。
$home_idをグローバル変数としてしまう手もありますが、今後の改変の際にうっかり変数を上書きされてしまう恐れもあります。そこでクラス化してしまうことにします。
class auto_home {
var $home_id;
function __construct() {
add_action( 'init', array( &$this, 'check_home_page' ) );
}
function auto_home() {
$this->__construct();
}
function check_home_page() {
global $wpdb;
$this->home_id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_title = 'ホーム' AND post_type = 'page'" );
if ( $this->home_id ) {
add_filter( 'pre_option_show_on_front', array( &$this, 'set_page_show_on_front' ) );
add_filter( 'pre_option_page_on_front', array( &$this, 'set_home_page_on_front' ) );
}
}
function set_page_show_on_front( $pre ) {
return 'page';
}
function set_home_page_on_front( $pre ) {
return $this->home_id;
}
}
$auto_home = new auto_home();
これをテーマのfunctions.phpに記述しておけば、思い通りの挙動になるかと思います。