assets()->manager()->load_assets( 'quiz_shortcode_block', [], '', false ); register_block_type('acadlix/quiz-shortcode', [ 'api_version' => 3, // 'editor_script' => 'acadlix-quiz-shortcode-block-editor', 'render_callback' => [$this, 'render'], 'attributes' => [ 'shortcodeId' => [ 'type' => 'number', 'default' => 0, ], 'template' => [ 'type' => 'string', 'default' => '', ], 'fields' => [ 'type' => 'string', 'default' => '', ], ], ]); } public function register_rest_routes() { register_rest_route( $this->namespace, '/' . $this->rest_base, [ [ 'methods' => WP_REST_Server::READABLE, 'callback' => [$this, 'get_quiz_options'], 'permission_callback' => function () { return current_user_can('edit_posts'); }, ], ] ); } public function get_quiz_options(WP_REST_Request $request) { $quizzes = acadlix() ->model() ->quiz() ->ofQuiz() ->without(['author', 'metas']) ->with('quiz_shortcode') ->whereHas('quiz_shortcode') ->orderBy('ID', 'desc') ->get(['ID', 'post_title']); $items = $quizzes ->map(function ($quiz) { $shortcode_id = absint($quiz->quiz_shortcode->id ?? 0); if (empty($shortcode_id)) { return null; } return [ 'value' => $shortcode_id, 'label' => sprintf('%s (#%d)', wp_strip_all_tags($quiz->post_title), $shortcode_id), 'quiz_id' => absint($quiz->ID), 'quiz_title' => wp_strip_all_tags($quiz->post_title), ]; }) ->filter() ->values(); return rest_ensure_response([ 'items' => $items, ]); } public function render($attributes) { $shortcode_id = absint($attributes['shortcodeId'] ?? 0); if (empty($shortcode_id)) { return ''; } $template = sanitize_text_field($attributes['template'] ?? ''); $fields = sanitize_text_field($attributes['fields'] ?? ''); $shortcode = '[Acadlix_Quiz ' . $shortcode_id; if ($template !== '') { $shortcode .= ' template="' . esc_attr($template) . '"'; } if ($fields !== '') { $shortcode .= ' fields="' . esc_attr($fields) . '"'; } $shortcode .= ']'; return do_shortcode($shortcode); } }