228 lines
6.0 KiB
PHP
228 lines
6.0 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* WPSEO plugin file.
|
||
|
*
|
||
|
* @package WPSEO\Admin
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* This class generates the metabox on the edit term page.
|
||
|
*/
|
||
|
class WPSEO_Taxonomy_Metabox {
|
||
|
|
||
|
/**
|
||
|
* The term currently being edited.
|
||
|
*
|
||
|
* @var WP_Term
|
||
|
*/
|
||
|
private $term;
|
||
|
|
||
|
/**
|
||
|
* The term's taxonomy.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
private $taxonomy;
|
||
|
|
||
|
/**
|
||
|
* Whether or not the social tab is enabled for this metabox.
|
||
|
*
|
||
|
* @var bool
|
||
|
*/
|
||
|
private $is_social_enabled;
|
||
|
|
||
|
/**
|
||
|
* Helper to determine whether or not the SEO analysis is enabled.
|
||
|
*
|
||
|
* @var WPSEO_Metabox_Analysis_SEO
|
||
|
*/
|
||
|
protected $seo_analysis;
|
||
|
|
||
|
/**
|
||
|
* Helper to determine whether or not the readability analysis is enabled.
|
||
|
*
|
||
|
* @var WPSEO_Metabox_Analysis_Readability
|
||
|
*/
|
||
|
protected $readability_analysis;
|
||
|
|
||
|
/**
|
||
|
* Helper to determine whether or not the inclusive language analysis is enabled.
|
||
|
*
|
||
|
* @var WPSEO_Metabox_Analysis_Inclusive_Language
|
||
|
*/
|
||
|
protected $inclusive_language_analysis;
|
||
|
|
||
|
/**
|
||
|
* The constructor.
|
||
|
*
|
||
|
* @param string $taxonomy The taxonomy.
|
||
|
* @param stdClass $term The term.
|
||
|
*/
|
||
|
public function __construct( $taxonomy, $term ) {
|
||
|
$this->term = $term;
|
||
|
$this->taxonomy = $taxonomy;
|
||
|
$this->is_social_enabled = WPSEO_Options::get( 'opengraph', false ) || WPSEO_Options::get( 'twitter', false );
|
||
|
|
||
|
$this->seo_analysis = new WPSEO_Metabox_Analysis_SEO();
|
||
|
$this->readability_analysis = new WPSEO_Metabox_Analysis_Readability();
|
||
|
$this->inclusive_language_analysis = new WPSEO_Metabox_Analysis_Inclusive_Language();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Shows the Yoast SEO metabox for the term.
|
||
|
*/
|
||
|
public function display() {
|
||
|
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string.
|
||
|
printf( '<div id="wpseo_meta" class="postbox yoast wpseo-taxonomy-metabox-postbox"><h2><span>%1$s</span></h2>', $this->get_product_title() );
|
||
|
|
||
|
echo '<div class="inside">';
|
||
|
echo '<div id="taxonomy_overall"></div>';
|
||
|
|
||
|
$this->render_hidden_fields();
|
||
|
$this->render_tabs();
|
||
|
|
||
|
echo '</div>';
|
||
|
echo '</div>';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Renders the metabox hidden fields.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
protected function render_hidden_fields() {
|
||
|
$fields_presenter = new WPSEO_Taxonomy_Fields_Presenter( $this->term );
|
||
|
$field_definitions = new WPSEO_Taxonomy_Fields();
|
||
|
|
||
|
echo $fields_presenter->html( $field_definitions->get( 'content' ) );
|
||
|
if ( WPSEO_Capability_Utils::current_user_can( 'wpseo_edit_advanced_metadata' ) || WPSEO_Options::get( 'disableadvanced_meta' ) === false ) {
|
||
|
echo $fields_presenter->html( $field_definitions->get( 'settings' ) );
|
||
|
}
|
||
|
|
||
|
if ( $this->is_social_enabled ) {
|
||
|
echo $fields_presenter->html( $field_definitions->get( 'social' ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Renders the metabox tabs.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
protected function render_tabs() {
|
||
|
echo '<div class="wpseo-metabox-content">';
|
||
|
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Reason: $this->get_product_title() returns a hard-coded string.
|
||
|
printf( '<div class="wpseo-metabox-menu"><ul role="tablist" class="yoast-aria-tabs" aria-label="%s">', $this->get_product_title() );
|
||
|
|
||
|
$tabs = $this->get_tabs();
|
||
|
|
||
|
foreach ( $tabs as $tab ) {
|
||
|
$tab->display_link();
|
||
|
}
|
||
|
|
||
|
echo '</ul></div>';
|
||
|
|
||
|
foreach ( $tabs as $tab ) {
|
||
|
$tab->display_content();
|
||
|
}
|
||
|
|
||
|
echo '</div>';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the relevant metabox sections for the current view.
|
||
|
*
|
||
|
* @return WPSEO_Metabox_Section[]
|
||
|
*/
|
||
|
private function get_tabs() {
|
||
|
$tabs = [];
|
||
|
|
||
|
$label = __( 'SEO', 'wordpress-seo' );
|
||
|
if ( $this->seo_analysis->is_enabled() ) {
|
||
|
$label = '<span class="wpseo-score-icon-container" id="wpseo-seo-score-icon"></span>' . $label;
|
||
|
}
|
||
|
|
||
|
$tabs[] = new WPSEO_Metabox_Section_React( 'content', $label );
|
||
|
|
||
|
if ( $this->readability_analysis->is_enabled() ) {
|
||
|
$tabs[] = new WPSEO_Metabox_Section_Readability();
|
||
|
}
|
||
|
|
||
|
if ( $this->inclusive_language_analysis->is_enabled() ) {
|
||
|
$tabs[] = new WPSEO_Metabox_Section_Inclusive_Language();
|
||
|
}
|
||
|
|
||
|
if ( $this->is_social_enabled ) {
|
||
|
$tabs[] = new WPSEO_Metabox_Section_React(
|
||
|
'social',
|
||
|
'<span class="dashicons dashicons-share"></span>' . __( 'Social', 'wordpress-seo' ),
|
||
|
'',
|
||
|
[
|
||
|
'html_after' => '<div id="wpseo-section-social"></div>',
|
||
|
]
|
||
|
);
|
||
|
}
|
||
|
|
||
|
$tabs = array_merge( $tabs, $this->get_additional_tabs() );
|
||
|
|
||
|
return $tabs;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the metabox tabs that have been added by other plugins.
|
||
|
*
|
||
|
* @return WPSEO_Metabox_Section_Additional[]
|
||
|
*/
|
||
|
protected function get_additional_tabs() {
|
||
|
$tabs = [];
|
||
|
|
||
|
/**
|
||
|
* Private filter: 'yoast_free_additional_taxonomy_metabox_sections'.
|
||
|
*
|
||
|
* Meant for internal use only. Allows adding additional tabs to the Yoast SEO metabox for taxonomies.
|
||
|
*
|
||
|
* @param array[] $tabs {
|
||
|
* An array of arrays with tab specifications.
|
||
|
*
|
||
|
* @type array $tab {
|
||
|
* A tab specification.
|
||
|
*
|
||
|
* @type string $name The name of the tab. Used in the HTML IDs, href and aria properties.
|
||
|
* @type string $link_content The content of the tab link.
|
||
|
* @type string $content The content of the tab.
|
||
|
* @type array $options {
|
||
|
* Optional. Extra options.
|
||
|
*
|
||
|
* @type string $link_class Optional. The class for the tab link.
|
||
|
* @type string $link_aria_label Optional. The aria label of the tab link.
|
||
|
* }
|
||
|
* }
|
||
|
* }
|
||
|
*/
|
||
|
$requested_tabs = apply_filters( 'yoast_free_additional_taxonomy_metabox_sections', [] );
|
||
|
|
||
|
foreach ( $requested_tabs as $tab ) {
|
||
|
if ( is_array( $tab ) && array_key_exists( 'name', $tab ) && array_key_exists( 'link_content', $tab ) && array_key_exists( 'content', $tab ) ) {
|
||
|
$options = array_key_exists( 'options', $tab ) ? $tab['options'] : [];
|
||
|
$tabs[] = new WPSEO_Metabox_Section_Additional(
|
||
|
$tab['name'],
|
||
|
$tab['link_content'],
|
||
|
$tab['content'],
|
||
|
$options
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $tabs;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Retrieves the product title.
|
||
|
*
|
||
|
* @return string The product title.
|
||
|
*/
|
||
|
protected function get_product_title() {
|
||
|
return YoastSEO()->helpers->product->get_product_name();
|
||
|
}
|
||
|
}
|