私は誰かがここで正しい方向に私を指すことができると思います。
私はWordpress Plugin Boilerplateを使ってカスタムプラグインを開発しています。インストール時に、プラグインは新しい投稿タイプ(course)、新しい分類法(course-area)を登録し、新しい投稿タイプと分類法のためのパーマリンク構造を設定します。
以下のようにActivatorクラスに自分のコード(投稿タイプと分類法を作成するため)を追加しましたが、コードが実行されていないようですこれは私が使っているadd_actionフック(プラグインインストール用のコーデックスで推奨されている 'init'フック)が原因で発生します。メインプラグインファイル(iwcollege -ourses.php)の中にありますが、私は本当によくわかりません。
プラグインを有効にしてもエラーが発生しません。有効になったように見えますが、カスタム投稿タイプや分類法は作成されません。
なぜこれが起こっているのか、そしてどうすればこれを直すことができるのでしょうか。
前もって感謝します、
アーロンベントレー:)
iwcollege -ourses.php
// The Activator class is called by the following code within the main plugin file as below:
function activate_IWCollege_Courses() {
require_once plugin_dir_path( __FILE__ ) . 'includes/class-iwcollege-courses-activator.php';
IWCollege_Courses_Activator::activate();
}
register_activation_hook( __FILE__, 'activate_IWCollege_Courses' );
class-iwcollege -ourses-activator.php
class IWCollege_Courses_Activator {
public static function activate() {
add_action( 'init', array( get_called_class(), 'create_course_post_type' ), 0 );
add_action( 'init', array( get_called_class(), 'create_course_area_taxonomies'), 0 );
add_filter( 'post_type_link', array( get_called_class(), 'course_permalink_structure'), 10, 4 );
flush_rewrite_rules();
}
public static function create_course_post_type() {
$labels = array(
'name' => 'Courses', 'post type general name',
'singular_name' => 'Course', 'post type singular name',
'add_new' => 'Add New', 'Course',
'add_new_item' => 'Add New Course',
'edit_item' => 'Edit Course',
'new_item' => 'New Course',
'all_items' => 'All Courses',
'view_item' => 'View Course',
'search_items' => 'Search Courses',
'not_found' => 'No Courses found',
'not_found_in_trash' => 'No Courses found in the Trash',
'parent_item_colon' => '',
'menu_name' => 'Courses',
'menu-icon' => 'dashicons-list-view'
);
$supports = array (
'title',
'editor',
'thumbnail',
'excerpt',
'revisions'
);
$capabilities = array(
'create_posts' => false
);
$rewrite = array(
'slug' => 'course-area/%course_areas_taxonomy%/courses',
'with_front' => true,
'hierarchical' => false
);
$args = array(
'labels' => $labels,
'supports' => $supports,
'description' => 'Holds IWCollege Course data',
'public' => true,
'rewrite' => $rewrite,
'menu_position' => 5,
'has_archive' => true,
'taxonomies' => array('post_tag'),
'capabilities' => $capabilities,
'map_meta_cap' => true,
'public' => true,
'query_var' => true,
'publicly_queryable' => true
);
register_post_type( 'course', $args );
}
public static function create_course_area_taxonomies() {
$labels = array(
'name' => 'Course Areas', 'taxonomy general name',
'singular_name' => 'Course Area', 'taxonomy singular name',
'search_items' => 'Search Course Areas',
'all_items' => 'All Course Areas',
'parent_item' => 'Parent Course Area',
'parent_item_colon' => 'Parent Course Area:',
'edit_item' => 'Edit Course Area',
'update_item' => 'Update Course Area',
'add_new_item' => 'Add New Course Area',
'new_item_name' => 'New Course Area Name',
'menu_name' => 'Course Areas',
'popular_items' => null
);
$rewrite = array(
'slug' => 'course-area',
'with_front' => true,
'hierarchical' => true,
'ep_mask' => 'ep-mask'
);
$capabilities = array(
'manage_terms' => true,
'edit_terms' => true,
'delete_terms' => false,
'assign_terms' => false
);
$args = array(
'hierarchical' => false,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => false,
'query_var' => true,
'sort' => false,
'public' => false,
'rewrite' => $rewrite,
'capabilities' => $capabilities,
'update_count_callback' => '_update_post_term_count'
);
register_taxonomy( 'course_areas_taxonomy', array('course'), $args );
register_taxonomy_for_object_type( 'course_areas_taxonomy', 'course' );
}
public static function course_permalink_structure ($post_link, $post, $leavename, $sample) {
if ( strpos( $post_link, '%course_areas_taxonomy%' ) !== false ) {
$course_post_type_term = get_the_terms( $post->ID, 'course_areas_taxonomy' );
$post_link = str_replace( '%course_areas_taxonomy%', array_pop( $course_post_type_term )->slug, $post_link );
}
return $post_link;
}
}
問題はregister_activation_hook( __FILE__, 'activate_IWCollege_Courses' );
を介したWordPressの初期化です。関数はプラグインのアクティベーション時に起動されました。フックinit
に切り替える必要があります。カスタム投稿タイプの場合、initフックはコーデックスで推奨されています。カスタム投稿タイプは、WordPressの初期化のたびに登録する必要があります。
しかし、あなたのアクティベーション方法の重要な部分flush_rewrite_rules();
は、パーマリンクを書き換えるためにアクティベーション時にのみ実行されるべきです。この関数は正しいです、それはregister_activation_hook()
について初期化することです。
あなたの問題に対する疑似例.
register_activation_hook( __FILE__, 'example_activate' );
function example_activate() {
flush_rewrite_rules();
}
add_action( 'init', 'example_register_cpt' );
function example_register_cpt() {
// All with the goal of:
register_post_type();
// And
register_taxonomy();
// much more, that run always on WP
}