function test_oembed_create_xml() { $actual = _oembed_create_xml(array('foo' => 'bar', 'bar' => 'baz', 'ping' => 'pong')); $expected = '<oembed><foo>bar</foo><bar>baz</bar><ping>pong</ping></oembed>'; $this->assertStringEndsWith($expected, trim($actual)); $actual = _oembed_create_xml(array('foo' => array('bar' => 'baz'), 'ping' => 'pong')); $expected = '<oembed><foo><bar>baz</bar></foo><ping>pong</ping></oembed>'; $this->assertStringEndsWith($expected, trim($actual)); $actual = _oembed_create_xml(array('foo' => array('bar' => array('ping' => 'pong')), 'hello' => 'world')); $expected = '<oembed><foo><bar><ping>pong</ping></bar></foo><hello>world</hello></oembed>'; $this->assertStringEndsWith($expected, trim($actual)); $actual = _oembed_create_xml(array(array('foo' => array('bar')), 'helloworld')); $expected = '<oembed><oembed><foo><oembed>bar</oembed></foo></oembed><oembed>helloworld</oembed></oembed>'; $this->assertStringEndsWith($expected, trim($actual)); }
/** * Creates an XML string from a given array. * * @since 4.4.0 * @access private * * @param array $data The original oEmbed response data. * @param SimpleXMLElement $node Optional. XML node to append the result to recursively. * @return string|false XML string on success, false on error. */ function _oembed_create_xml($data, $node = null) { if (!is_array($data) || empty($data)) { return false; } if (null === $node) { $node = new SimpleXMLElement('<oembed></oembed>'); } foreach ($data as $key => $value) { if (is_numeric($key)) { $key = 'oembed'; } if (is_array($value)) { $item = $node->addChild($key); _oembed_create_xml($value, $item); } else { $node->addChild($key, esc_html($value)); } } return $node->asXML(); }
/** * Print the oEmbed XML response. * * @since 4.4.0 * * @param array $data The oEmbed response data. * @return string The XML response data. */ public function xml_response($data) { if (!class_exists('SimpleXMLElement')) { status_header(501); return get_status_header_desc(501); } $result = _oembed_create_xml($data); // Bail if there's no XML. if (!$result) { status_header(501); return get_status_header_desc(501); } if (!headers_sent()) { header('Content-Type: text/xml; charset=' . get_option('blog_charset')); } return $result; }
/** * If oEmbed request wants XML, return XML instead of JSON. * * Basically a copy of {@link _oembed_rest_pre_serve_request()}. Unfortunate * that we have to duplicate this just for a URL check. * * @since 2.6.0 * * @param bool $served Whether the request has already been served. * @param WP_HTTP_ResponseInterface $result Result to send to the client. Usually a WP_REST_Response. * @param WP_REST_Request $request Request used to generate the response. * @param WP_REST_Server $server Server instance. * @return bool */ public function oembed_xml_request($served, $result, $request, $server) { $params = $request->get_params(); if (!isset($params['format']) || 'xml' !== $params['format']) { return $served; } // Validate URL against our oEmbed endpoint. If not valid, bail. // This is our mod to _oembed_rest_pre_serve_request(). $query_params = $request->get_query_params(); if (false === $this->validate_url_to_item_id($query_params['url'])) { return $served; } // Embed links inside the request. $data = $server->response_to_data($result, false); if (!class_exists('SimpleXMLElement')) { status_header(501); die(get_status_header_desc(501)); } $result = _oembed_create_xml($data); // Bail if there's no XML. if (!$result) { status_header(501); return get_status_header_desc(501); } if (!headers_sent()) { $server->send_header('Content-Type', 'text/xml; charset=' . get_option('blog_charset')); } echo $result; return true; }
/** * Print the oEmbed XML response. * * @since 4.4.0 * * @param array $data The oEmbed response data. * @return string The XML response data. */ public function xml_response($data) { $result = _oembed_create_xml($data); // Bail if there's no XML. if (!$result) { status_header(501); return 'Not implemented'; } if (!headers_sent()) { header('Content-Type: text/xml; charset=' . get_option('blog_charset')); } return $result; }