oont-contents/plugins/insert-headers-and-footers/includes/admin/class-wpcode-docs.php
2025-02-08 15:10:23 +01:00

177 lines
4 KiB
PHP

<?php
/**
* Load docs data from the server and store it
* in local file cache in the uplaods folder.
*
* @package WPCode
*/
/**
* The class to load docs data from the server.
*/
class WPCode_Docs {
/**
* The URL from which to grab docs.
*
* @var string
*/
public $url = 'https://cdn.wpcode.com/wp-content/docs.json';
/**
* The categories.
*
* @var array
*/
private $categories;
/**
* The docs data.
*
* @var array
*/
private $docs;
/**
* Load docs data from cache or from the server.
*
* @return void
*/
public function load_docs_data() {
$docs_data = wpcode()->file_cache->get( 'docs', DAY_IN_SECONDS );
if ( false === $docs_data ) {
$docs_data = $this->load_from_server();
wpcode()->file_cache->set( 'docs', $docs_data );
}
$this->categories = isset( $docs_data['categories'] ) ? $docs_data['categories'] : array();
$this->docs = isset( $docs_data['docs'] ) ? $docs_data['docs'] : array();
}
/**
* Get the docs.
*
* @return array
*/
public function get_docs() {
if ( ! isset( $this->docs ) ) {
$this->load_docs_data();
}
return $this->docs;
}
/**
* Get the docs categories.
*
* @return array
*/
public function get_categories() {
if ( ! isset( $this->categories ) ) {
$this->load_docs_data();
}
return $this->categories;
}
/**
* Load the docs data from the server.
*
* @return array
*/
public function load_from_server() {
$request = wp_remote_get( $this->url );
if ( wp_remote_retrieve_response_code( $request ) > 299 ) {
return array();
}
return json_decode( wp_remote_retrieve_body( $request ), true );
}
/**
* Go through all the docs and retrieve just those for this category.
*
* @param string $slug The category slug.
*
* @return array
*/
public function get_docs_for_category( $slug ) {
$docs = $this->get_docs();
ksort( $docs );
$category_docs = array();
// Until we drop PHP 5.2 support to use closure.
foreach ( $docs as $doc ) {
if ( ! in_array( $slug, $doc['categories'], true ) ) {
continue;
}
$category_docs[] = $doc;
}
return $category_docs;
}
/**
* Output the docs categories markup.
*
* @return void
*/
public function get_categories_accordion() {
?>
<div id="wpcode-help-categories" style="transition: opacity 300ms ease-in 0s; opacity: 1;">
<ul class="wpcode-help-categories-toggle">
<?php
$ci = 0;
$categories = $this->get_categories();
foreach ( $categories as $slug => $category_title ) {
$style = 0 === $ci ? 'display:block' : '';
$class = 0 === $ci ? 'wpcode-help-category open' : 'wpcode-help-category';
$ci ++;
$docs = $this->get_docs_for_category( $slug );
$i = 0;
?>
<li class="<?php echo esc_attr( $class ); ?>">
<header>
<?php wpcode_icon( 'folder', 28, 22 ); ?>
<span><?php echo esc_html( $category_title ); ?></span>
<?php wpcode_icon( 'arrow', 10, 16 ); ?>
</header>
<ul class="wpcode-help-docs" style="<?php echo esc_attr( $style ); ?>">
<?php
foreach ( $docs as $doc ) {
$i ++;
?>
<li>
<?php wpcode_icon( 'file-text', 16, 16 ); ?>
<a href="<?php echo esc_url( wpcode_utm_url( $doc['url'], 'help-overlay', 'view-doc', esc_attr( $doc['title'] ) ) ); ?>" rel="noopener noreferrer" target="_blank">
<?php echo esc_html( $doc['title'] ); ?>
</a>
</li>
<?php
if ( 5 === $i && count( $docs ) > 5 ) {
echo '<div style="display: none;">';
}
}
if ( count( $docs ) > 5 ) {
echo '</div>' // Hidden div for the rest of the elements.
?>
<button class="wpcode-button wpcode-button-secondary viewall" type="button">
<?php
printf(
// Translators: Placeholder for the category name.
esc_html__( 'View All %s Docs', 'insert-headers-and-footers' ),
esc_html( $category_title )
);
?>
</button>
<?php } ?>
</ul>
</li>
<?php } ?>
</ul>
</div>
<?php
}
}