web-dev-qa-db-ja.com

WordPress Plugin Boilerplate - static "activate"関数のadd_actionフック

私は誰かがここで正しい方向に私を指すことができると思います。

私は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;
    }
}
1
Aaron Bentley

問題は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
}
2
bueltge