web-dev-qa-db-ja.com

カスタム投稿タイプregister_post_type()で致命的なエラーが発生しました

ガイドに従うことによってOOPを使用して私の最初のWordpressプラグインを開発しようとしています。私はこれまでWord for Wordに従ってきましたが、URLになると私が想像するものを書き換えることができないという問題に苦しんでいます。

これは私が使っているコードです...

class BookItNow
{
function __construct()
{
    add_action('init', $this->custom_post_type());
}

function activate()
{
    $this->custom_post_type();
    flush_rewrite_rules();
}

function register()
{
    add_action('admin_enqueue_scripts', array($this, 'enqueue'));
}

function deactivate()
{
    flush_rewrite_rules();
}

function custom_post_type()
{
    register_post_type('bookings', ['public' => true, 'label' => 'Bookings']);
}

function enqueue()
{
    wp_enqueue_style('style', plugins_url('/assets/style.css', __FILE__));
}
}

if (class_exists('BookItNow')) {
    $book = new BookItNow();
    $book->register();
}

register_activation_hook(__FILE__, array($book, 'activate'));
register_deactivation_hook(__FILE__, array($book, 'deactivate'));
register_uninstall_hook(__FILE__, array($book, 'uninstall'));

そしてこれは私がUncaught Error: Call to a member function add_rewrite_tag() on nullを取得しているエラーです。 $this->custom_post_type()を削除するとこの問題は解決されるので、私はわかりません。任意の助けがいただければ幸いです。

1
tallent123

これらの変更を試してください。

1)プラグインやテーマが関数名だけを渡すのではなくクラスを使って構築されているときにadd_action()を使うには、クラス($ this)と呼び出し可能な関数( 'custom_post_type')を参照して配列を渡す必要があります。

function __construct()
{
    add_action('init', array( $this, 'custom_post_type' ) );
}

2) 'custom_post_type'と呼ばれるオリジナルの 'activate'メソッドは、プラグインがアクティブ化されたときに一度だけ呼び出す必要があることを示唆しています。しかし、カスタムの投稿タイプを正しく登録するためには、Wordpressがロードされるたびにこのメソッドを呼び出す必要があるため、 'init'フックに追加されています。 activateメソッドで呼び出しても意味がありませんので、削除しました。

function activate()
{
    flush_rewrite_rules();
}
4
locomo