links = &$polylang->links; $this->model = &$polylang->model; add_action( 'rest_api_init', array( $this, 'init' ) ); } /** * Init filters and new endpoints. * * @since 2.2 * * @return void */ public function init() { $this->post_types = array_fill_keys( array_intersect( $this->model->get_translated_post_types(), get_post_types( array( 'show_in_rest' => true ) ) ), array() ); /** * Filters post types and their options passed to PLL_Rest_Post contructor. * * @since 2.2.1 * * @param array $post_types An array of arrays with post types as keys and options as values. */ $this->post_types = apply_filters( 'pll_rest_api_post_types', $this->post_types ); $this->post = new PLL_REST_Post( $this, $this->post_types ); $taxonomies = array_fill_keys( array_intersect( $this->model->get_translated_taxonomies(), get_taxonomies( array( 'show_in_rest' => true ) ) ), array() ); /** * Filters taxonomies and their options passed to PLL_Rest_Term constructor. * * @since 2.2.1 * * @param array $taxonomies An array of arrays with taxonomies as keys and options as values. */ $taxonomies = apply_filters( 'pll_rest_api_taxonomies', $taxonomies ); $this->term = new PLL_REST_Term( $this, $taxonomies ); $this->comment = new PLL_REST_Comment( $this ); register_rest_route( 'pll/v1', '/languages', array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_languages_list' ), 'permission_callback' => '__return_true', ) ); register_rest_route( 'pll/v1', '/untranslated-posts', array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_untranslated_posts' ), 'permission_callback' => '__return_true', 'args' => $this->get_untranslated_posts_collection_params(), ) ); } /** * Retrieves the query params for the untranslated posts collection. * * @since 2.6.0 * * @return array Collection parameters. */ public function get_untranslated_posts_collection_params() { $language_slugs = $this->model->get_languages_list( array( 'fields' => 'slug' ) ); return array( 'type' => array( 'description' => __( 'Limit results to items of an object type.', 'polylang-pro' ), 'type' => 'string', 'required' => true, 'enum' => array_keys( $this->post_types ), ), 'untranslated_in' => array( 'description' => __( 'Limit results to untranslated items in a language.', 'polylang-pro' ), 'type' => 'string', 'required' => true, 'enum' => $language_slugs, ), 'lang' => array( 'description' => __( 'Limit results to items in a language.', 'polylang-pro' ), 'type' => 'string', 'required' => true, 'enum' => $language_slugs, ), 'context' => array( 'description' => __( 'Scope under which the request is made; determines fields present in response.', 'polylang-pro' ), 'type' => 'string', 'required' => true, 'enum' => array( 'edit' ), ), 'search' => array( 'description' => __( 'Limit results to those matching a string.', 'polylang-pro' ), 'type' => 'string', ), 'include' => array( 'description' => __( 'Add this post\'s translation to results.', 'polylang-pro' ), 'type' => 'integer', 'sanitize_callback' => 'absint', ), ); } /** * Returns a list of posts not translated in a language. * * @since 2.6.0 * * @param WP_REST_Request $request REST API request. * @return array */ public function get_untranslated_posts( WP_REST_Request $request ) { $return = array(); $type = $request->get_param( 'type' ); $untranslated_in = $this->model->get_language( $request->get_param( 'untranslated_in' ) ); $lang = $this->model->get_language( $request->get_param( 'lang' ) ); $search = $request->get_param( 'search' ); if ( ! is_string( $type ) || empty( $untranslated_in ) || empty( $lang ) ) { return array(); } if ( ! is_string( $search ) ) { $search = ''; } $untranslated_posts = $this->model->post->get_untranslated( $type, $untranslated_in, $lang, $search ); // Add current translation in list. if ( $post_id = $this->model->post->get_translation( $request->get_param( 'include' ), $lang ) ) { $post = get_post( $post_id ); if ( $post instanceof WP_Post ) { array_unshift( $untranslated_posts, $post ); } } // Format output. foreach ( $untranslated_posts as $post ) { $values = array( 'id' => $post->ID, 'title' => array( 'raw' => $post->post_title, 'rendered' => get_the_title( $post->ID ), ), ); if ( pll_is_edit_rest_request( $request ) ) { $values['block_editor']['edit_link'] = get_edit_post_link( $post, 'keep ampersand' ); $values['caps'] = array( 'edit' => current_user_can( 'edit_post', $post->ID ), 'delete' => current_user_can( 'delete_post', $post->ID ), ); } $return[] = $values; } return $return; } /** * Returns the list of available languages specifying the default language. * * @since 3.2 * * @return array[] List of PLL_Language objects. * @phpstan-return array> */ public function get_languages_list() { $languages = $this->model->get_languages_list(); $languages_with_default_lang = array(); foreach ( $languages as $language ) { $languages_with_default_lang[] = $language->to_array(); } return array_values( $languages_with_default_lang ); } }