You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.3 KiB
PHTML
74 lines
1.3 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The Schema Parser
|
||
|
*
|
||
|
* @since 1.0.0
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMathPro
|
||
|
* @author MyThemeShop <admin@mythemeshop.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMathPro\Schema;
|
||
|
|
||
|
use WP_Error;
|
||
|
use DOMXpath;
|
||
|
use DOMDocument;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Parser class.
|
||
|
*/
|
||
|
class Parser {
|
||
|
|
||
|
/**
|
||
|
* Get json from url.
|
||
|
*
|
||
|
* @param string $url Url to fetch html from.
|
||
|
*/
|
||
|
public function from_url( $url ) {
|
||
|
$response = wp_remote_get(
|
||
|
$url,
|
||
|
[
|
||
|
'timeout' => 30,
|
||
|
'sslverify' => false,
|
||
|
]
|
||
|
);
|
||
|
|
||
|
if ( is_wp_error( $response ) ) {
|
||
|
return $response;
|
||
|
}
|
||
|
|
||
|
$response = wp_remote_retrieve_body( $response );
|
||
|
if ( empty( $response ) ) {
|
||
|
return new WP_Error( 'body_not_found', esc_html__( 'No html body found.', 'rank-math-pro' ) );
|
||
|
}
|
||
|
|
||
|
return $this->from_html( $response );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get json from html.
|
||
|
*
|
||
|
* @param string $html HTML to parse.
|
||
|
*/
|
||
|
public function from_html( $html ) {
|
||
|
libxml_use_internal_errors( 1 );
|
||
|
|
||
|
// DOM.
|
||
|
$dom = new DOMDocument();
|
||
|
$dom->loadHTML( $html );
|
||
|
|
||
|
// XPath.
|
||
|
$xpath = new DOMXpath( $dom );
|
||
|
$scripts = $xpath->query( '//script[@type="application/ld+json"]' );
|
||
|
|
||
|
$json = [];
|
||
|
foreach ( $scripts as $script ) {
|
||
|
$json[] = json_decode( trim( $script->nodeValue ) ); // phpcs:ignore
|
||
|
}
|
||
|
|
||
|
return $json;
|
||
|
}
|
||
|
}
|