<?php
declare( strict_types=1 );
namespace Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter;
use Automattic\WooCommerce\GoogleListingsAndAds\Infrastructure\Service;
use Automattic\WooCommerce\GoogleListingsAndAds\Proxies\WC;
use Automattic\WooCommerce\GoogleListingsAndAds\Google\GoogleHelper;
use Automattic\WooCommerce\GoogleListingsAndAds\PluginHelper;
use Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter\TargetAudience;
defined( 'ABSPATH' ) || exit;
/**
* Class PolicyComplianceCheck
*
* @package Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter
*
* @since 2.1.4
*/
class PolicyComplianceCheck implements Service {
use PluginHelper;
/**
* The WC proxy object.
*
* @var wc
*/
protected $wc;
/**
* @var GoogleHelper
*/
protected $google_helper;
/**
* @var TargetAudience
*/
protected $target_audience;
/**
* BaseController constructor.
*
* @param WC $wc
* @param GoogleHelper $google_helper
* @param TargetAudience $target_audience
*/
public function __construct( WC $wc, GoogleHelper $google_helper, TargetAudience $target_audience ) {
$this->wc = $wc;
$this->google_helper = $google_helper;
$this->target_audience = $target_audience;
}
/**
* Check if the store website is accessed by all users for the controller.
*
* @return bool
*/
public function is_accessible(): bool {
$all_allowed_countries = $this->wc->get_allowed_countries();
$target_countries = $this->target_audience->get_target_countries();
foreach ( $target_countries as $country ) {
if ( ! array_key_exists( $country, $all_allowed_countries ) ) {
return false;
}
}
return true;
}
/**
* Check if the store sample product landing pages lead to a 404 error.
*
* @return bool
*/
public function has_page_not_found_error(): bool {
$url = $this->get_landing_page_url();
$response = wp_remote_get( $url );
if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
return true;
}
return false;
}
/**
* Check if the store sample product landing pages has redirects through 3P domains.
*
* @return bool
*/
public function has_redirects(): bool {
$url = $this->get_landing_page_url();
$response = wp_remote_get( $url, [ 'redirection' => 0 ] );
$code = wp_remote_retrieve_response_code( $response );
if ( $code >= 300 && $code <= 399 ) {
return true;
}
return false;
}
/**
* Returns a product page URL, uses homepage as a fallback.
*
* @return string Landing page URL.
*/
private function get_landing_page_url(): string {
$products = wc_get_products( [ 'limit' => 1 ] );
if ( ! empty( $products ) ) {
return $products[0]->get_permalink();
}
return $this->get_site_url();
}
/**
* Check if the merchant set the restrictions in robots.txt or not in the store.
*
* @return bool
*/
public function has_restriction(): bool {
return ! $this->robots_allowed( $this->get_site_url() );
}
/**
* Check if the robots.txt has restrictions or not in the store.
*
* @param string $url
* @return bool
*/
private function robots_allowed( $url ) {
$agents = [ preg_quote( '*', '/' ) ];
$agents = implode( '|', $agents );
// location of robots.txt file
$response = wp_remote_get( trailingslashit( $url ) . 'robots.txt' );
if ( is_wp_error( $response ) ) {
return true;
}
$body = wp_remote_retrieve_body( $response );
$robotstxt = preg_split( "/\r\n|\n|\r/", $body );
if ( empty( $robotstxt ) ) {
return true;
}
$rule_applies = false;
foreach ( $robotstxt as $line ) {
$line = trim( $line );
if ( ! $line ) {
continue;
}
// following rules only apply if User-agent matches '*'
if ( preg_match( '/^\s*User-agent:\s*(.*)/i', $line, $match ) ) {
$rule_applies = '*' === $match[1];
}
if ( $rule_applies && preg_match( '/^\s*Disallow:\s*(.*)/i', $line, $regs ) ) {
if ( ! $regs[1] ) {
return true;
}
if ( '/' === trim( $regs[1] ) ) {
return false;
}
}
}
return true;
}
/**
* Check if the payment gateways is empty or not for the controller.
*
* @return bool
*/
public function has_payment_gateways(): bool {
$gateways = $this->wc->get_available_payment_gateways();
if ( empty( $gateways ) ) {
return false;
}
return true;
}
/**
* Check if the store is using SSL for the controller.
*
* @return bool
*/
public function get_is_store_ssl(): bool {
return 'https' === wp_parse_url( $this->get_site_url(), PHP_URL_SCHEME );
}
/**
* Check if the store has refund return policy page for the controller.
*
* @return bool
*/
public function has_refund_return_policy_page(): bool {
// Check the slug as it's translated by the "woocommerce" text domain name.
// phpcs:ignore WordPress.WP.I18n.TextDomainMismatch
if ( $this->the_slug_exists( _x( 'refund_returns', 'Page slug', 'woocommerce' ) ) ) {
return true;
}
return false;
}
/**
* Check if the slug exists or not.
*
* @param string $post_name
* @return bool
*/
protected function the_slug_exists( string $post_name ): bool {
$args = [
'name' => $post_name,
'post_type' => 'page',
'post_status' => 'publish',
'numberposts' => 1,
];
if ( get_posts( $args ) ) {
return true;
}
return false;
}
}