File: /home/adltc/public_html/wp-content/plugins/jet-engine/includes/compatibility/packages/seo.php
<?php
/**
* Seo compatibility class
*/
// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
die;
}
if ( ! class_exists( 'Jet_Engine_Seo_Package' ) ) {
/**
* Define Jet_Engine_Seo_Package class
*/
class Jet_Engine_Seo_Package {
public $settings_key = 'jet-engine-seo-settings';
public $settings = false;
public $defaults = array(
'fields' => array(),
);
public function __construct() {
add_action( 'jet-engine/dashboard/tabs', array( $this, 'register_settings_tab' ), 99 );
add_action( 'jet-engine/dashboard/assets', array( $this, 'enqueue_settings_js' ) );
add_action( 'wp_ajax_jet_engine_seo_save_settings', array( $this, 'save_settings' ) );
// Enqueue seo analysis script for Rank Math and Yoast.
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
// SEOPress Content Analysis.
add_filter( 'seopress_content_analysis_content', array( $this, 'seopress_analysis_content' ), 10, 2 );
// RankMath Snippets
add_action( 'rank_math/vars/register_extra_replacements', array( $this, 'register_rank_math_cct_field_snippet' ) );
// Set the primary term the first
add_filter( 'jet-engine/listings/dynamic-terms/items', array( $this, 'set_primary_term_first' ), 10, 3 );
}
/**
* Is Rank Math Seo plugin activated.
*
* @return bool
*/
public function is_rank_math_activated() {
return defined( 'RANK_MATH_VERSION' );
}
/**
* Is Yoast Seo plugin activated.
*
* @return bool
*/
public function is_yoast_activated() {
return defined( 'WPSEO_VERSION' );
}
/**
* Is SEOPress plugin activated.
*
* @return bool
*/
public function is_seopress_activated() {
return defined( 'SEOPRESS_VERSION' );
}
/**
* Register settings tab
*
* @return void
*/
public function register_settings_tab() {
?>
<cx-vui-tabs-panel
name="seo_settings"
label="<?php _e( 'SEO', 'jet-engine' ); ?>"
key="seo_settings"
>
<keep-alive>
<jet-engine-seo-settings></jet-engine-seo-settings>
</keep-alive>
</cx-vui-tabs-panel>
<?php
}
/**
* Register settings JS file
*
* @return void
*/
public function enqueue_settings_js() {
wp_enqueue_script(
'jet-engine-seo-settings',
jet_engine()->plugin_url( 'assets/js/admin/seo/settings.js' ),
array( 'cx-vue-ui' ),
jet_engine()->get_version(),
true
);
$settings = $this->get_all();
if ( ! empty( $settings['fields'] ) ) {
$settings['fields'] = $this->prepared_fields_setting_for_js( $settings['fields'] );
} else {
$settings['fields'] = array();
}
wp_localize_script(
'jet-engine-seo-settings',
'JetEngineSeoSettings',
array(
'fields' => $this->get_available_fields(),
'settings' => $settings,
'_nonce' => wp_create_nonce( $this->settings_key ),
)
);
add_action( 'admin_footer', array( $this, 'print_templates' ) );
}
/**
* Print Vue template for Seo settings
*
* @return void
*/
public function print_templates() {
?>
<script type="text/x-template" id="jet_engine_seo_settings">
<div>
<cx-vui-component-wrapper
label="<?php _e( 'Fields to parse', 'jet-engine' ); ?>"
description="<?php _e( 'Select meta fields you want to be parsed by SEO plugins ( Rank Math, Yoast or SEOPress )', 'jet-engine' ); ?>"
:wrapper-css="[ 'vertical-fullwidth' ]"
>
<div class="cx-vui-inner-panel">
<div class="jet-engine-skins-settings-grid">
<div class="jet-engine-skins-settings-item" v-for="( group, objSlug ) in fields" :key="objSlug">
<cx-vui-checkbox
:name="objSlug"
:label="group.label"
return-type="array"
:wrapper-css="[ 'vertical-fullwidth' ]"
:options-list="group.fields"
v-model="settings.fields"
></cx-vui-checkbox>
</div>
</div>
</div>
</cx-vui-component-wrapper>
<cx-vui-component-wrapper
:wrapper-css="[ 'vertical-fullwidth', 'jet-is-stackable' ]"
>
<cx-vui-button
button-style="accent"
:loading="saving"
@click="saveSettings"
>
<span
slot="label"
v-html="'<?php _e( 'Save', 'jet-engine' ); ?>'"
></span>
</cx-vui-button>
<span
class="cx-vui-inline-notice cx-vui-inline-notice--success"
v-if="'success' === result"
v-html="successMessage"
></span>
<span
class="cx-vui-inline-notice cx-vui-inline-notice--error"
v-if="'error' === result"
v-html="errorMessage"
></span>
</cx-vui-component-wrapper>
</div>
</script>
<?php
}
public function get_available_fields() {
$fields = jet_engine()->meta_boxes->get_registered_fields();
$result = array();
if ( empty( $fields ) ) {
return $result;
}
$post_types = get_post_types( array(), 'objects' );
//$taxonomies = get_taxonomies( array(), 'objects' );
$available_field_types = apply_filters( 'jet-engine/compatibility/seo/available-field-types', array(
'text',
'textarea',
'wysiwyg',
'repeater',
'media',
'gallery',
) );
foreach ( $fields as $object => $obj_fields ) {
$group_label = false;
if ( isset( $post_types[ $object ] ) ) {
$group_label = $post_types[ $object ]->labels->name;
}
//if ( isset( $taxonomies[ $object ] ) ) {
// $group_label = $taxonomies[ $object ]->labels->name;
//}
if ( ! $group_label ) {
continue;
}
$group = array();
foreach ( $obj_fields as $field_data ) {
if ( ! empty( $field_data['object_type'] ) && 'field' !== $field_data['object_type'] ) {
continue;
}
if ( ! in_array( $field_data['type'], $available_field_types ) ) {
continue;
}
$name = $object . '::' . $field_data['name'];
$title = ! empty( $field_data['title'] ) ? $field_data['title'] : $name;
if ( 'repeater' === $field_data['type'] ) {
if ( empty( $field_data['repeater-fields'] ) ) {
continue;
}
foreach ( $field_data['repeater-fields'] as $repeater_field ) {
if ( ! in_array( $repeater_field['type'], $available_field_types ) ) {
continue;
}
$r_name = $repeater_field['name'];
$r_title = ! empty( $repeater_field['title'] ) ? $repeater_field['title'] : $name;
$group[] = array(
'label' => $title . ': ' . $r_title,
'value' => $name . '[' . $r_name . ']',
);
}
} else {
$group[] = array(
'label' => $title,
'value' => $name
);
}
}
if ( ! empty( $group ) ) {
$result[ $object ] = array(
'label' => $group_label,
'fields' => $group,
);
}
}
return $result;
}
/**
* Ajax callback to save settings
*
* @return void
*/
public function save_settings() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_send_json_error( array( 'message' => __( 'Access denied', 'jet-engine' ) ) );
}
$nonce = ! empty( $_REQUEST['nonce'] ) ? $_REQUEST['nonce'] : false;
if ( ! $nonce || ! wp_verify_nonce( $nonce, $this->settings_key ) ) {
wp_send_json_error( array( 'message' => __( 'Nonce validation failed', 'jet-engine' ) ) );
}
$settings = ! empty( $_REQUEST['settings'] ) ? $_REQUEST['settings'] : array();
if ( ! empty( $settings['fields'] ) ) {
$settings['fields'] = $this->prepared_fields_setting_for_db( $settings['fields'] );
}
update_option( $this->settings_key, $settings, false );
wp_send_json_success( array( 'message' => __( 'Settings saved', 'jet-engine' ) ) );
}
/**
* Returns all settings
*
* @return array
*/
public function get_all() {
if ( false === $this->settings ) {
$this->settings = get_option( $this->settings_key, $this->defaults );
}
return $this->settings;
}
/**
* Returns specific setting
*
* @param string $setting
* @return mixed
*/
public function get( $setting ) {
$settings = $this->get_all();
if ( isset( $settings[ $setting ] ) ) {
return $settings[ $setting ];
} elseif ( isset( $this->defaults[ $setting ] ) ) {
return $this->defaults[ $setting ];
} else {
return false;
}
}
public function admin_enqueue_scripts( $hook ) {
if ( isset( $_GET['action'] ) && 'elementor' === $_GET['action'] ) {
return;
}
if ( ! $this->is_rank_math_activated() && ! $this->is_yoast_activated() ) {
return;
}
$obj = false;
if ( in_array( $hook, array( 'post.php', 'post-new.php' ) ) ) {
$obj = get_post_type();
}
//if ( in_array( $hook, array( 'term.php', 'edit-tags.php' ) ) ) {
// $obj = isset( $_GET['taxonomy'] ) ? $_GET['taxonomy'] : false;
//}
if ( ! $obj ) {
return;
}
$all_fields = $this->get( 'fields' );
$current_obj_fields = ! empty( $all_fields[ $obj ] ) ? $all_fields[ $obj ] : false;
if ( empty( $current_obj_fields ) ) {
return;
}
$script_depends = array( 'jquery' );
if ( $this->is_rank_math_activated() ) {
$script_depends[] = 'wp-hooks';
$script_depends[] = 'rank-math-analyzer';
}
wp_enqueue_script(
'jet-engine-seo-analysis',
jet_engine()->plugin_url( 'assets/js/admin/seo/seo-analysis.js' ),
$script_depends,
jet_engine()->get_version(),
true
);
wp_localize_script(
'jet-engine-seo-analysis',
'JetEngineSeoConfig',
array(
'isRankMathActived' => $this->is_rank_math_activated(),
'isYoastActived' => $this->is_yoast_activated(),
'fields' => $current_obj_fields,
)
);
}
public function prepared_fields_setting_for_db( $fields = array() ) {
$prepared_fields = array();
foreach ( $fields as $field ) {
$field_data = explode( '::', $field );
$field_obj = $field_data[0];
$field_name = $field_data[1];
$prepared_fields[ $field_obj ][] = $field_name;
}
return $prepared_fields;
}
public function prepared_fields_setting_for_js( $fields = array() ) {
$prepared_fields = array();
foreach ( $fields as $obj => $obj_fields ) {
if ( empty( $obj_fields ) ) {
continue;
}
foreach ( $obj_fields as $field ) {
$prepared_fields[] = $obj . '::' . $field;
}
}
return $prepared_fields;
}
public function seopress_analysis_content( $content, $id ) {
$post_type = get_post_type( $id );
if ( ! $post_type ) {
return $content;
}
$all_fields = $this->get( 'fields' );
$current_obj_fields = ! empty( $all_fields[ $post_type ] ) ? $all_fields[ $post_type ] : false;
if ( empty( $current_obj_fields ) ) {
return $content;
}
$all_fields_args = jet_engine()->meta_boxes->get_fields_for_context( 'post_type', $post_type );
$all_fields_names = wp_list_pluck( $all_fields_args, 'name' );
$fields_args = array_combine( $all_fields_names, $all_fields_args );
$fields_content = '';
foreach ( $current_obj_fields as $field_key ) {
$is_repeater = ( false !== strpos( $field_key, '[' ) && false !== strpos( $field_key, ']' ) );
if ( $is_repeater ) {
preg_match( '/(.+)\[(.+)\]/', $field_key, $matches );
$repeater_key = ! empty( $matches[1] ) ? $matches[1] : false;
$repeater_field_key = ! empty( $matches[2] ) ? $matches[2] : false;
if ( ! $repeater_key || ! $repeater_field_key ) {
continue;
}
$repeater_items = get_post_meta( $id, $repeater_key, true );
if ( empty( $repeater_items ) ) {
continue;
}
$field_args = ! empty( $fields_args[ $repeater_key ] ) ? $fields_args[ $repeater_key ] : array();
$sub_fields = ! empty( $field_args['repeater-fields'] ) ? $field_args['repeater-fields'] : array();
$sub_fields_names = wp_list_pluck( $sub_fields, 'name' );
$sub_fields_args = array_combine( $sub_fields_names, $sub_fields );
$sub_field_args = ! empty( $sub_fields_args[ $repeater_field_key ] ) ? $sub_fields_args[ $repeater_field_key ] : array();
$sub_field_type = ! empty( $sub_field_args['type'] ) ? $sub_field_args['type'] : 'text';
foreach ( $repeater_items as $repeater_item ) {
if ( ! empty( $repeater_item[ $repeater_field_key ] ) ) {
if ( in_array( $sub_field_type, array( 'media', 'gallery' ) ) ) {
$fields_content .= "\n" . $this->get_media_content( $repeater_item[ $repeater_field_key ], $sub_field_type );
} else {
$fields_content .= "\n" . $repeater_item[ $repeater_field_key ];
}
}
}
} else {
$field_content = get_post_meta( $id, $field_key, true );
if ( ! empty( $field_content ) ) {
$field_args = ! empty( $fields_args[ $field_key ] ) ? $fields_args[ $field_key ] : array();
$field_type = ! empty( $field_args['type'] ) ? $field_args['type'] : 'text';
if ( in_array( $field_type, array( 'media', 'gallery' ) ) ) {
$fields_content .= "\n" . $this->get_media_content( $field_content, $field_type );
} else {
$fields_content .= "\n" . $field_content;
}
}
}
}
if ( ! empty( $fields_content ) ) {
$content = $content . wp_kses_post( $fields_content );
}
return $content;
}
public function get_media_content( $value = null, $type = 'media' ) {
$result = '';
if ( 'media' === $type ) {
$value = array( $value );
} elseif ( 'gallery' === $type && ! is_array( $value ) ) {
$value = explode( ',', $value );
}
foreach ( $value as $img ) {
$img_data = Jet_Engine_Tools::get_attachment_image_data_array( $img );
if ( ! empty( $img_data['url'] ) ) {
$alt = ! empty( $img_data['id'] ) ? get_post_meta( $img_data['id'], '_wp_attachment_image_alt', true ) : '';
$result .= "\n" . '<img src="' . esc_url( $img_data['url'] ) . '" alt="' . esc_attr( $alt ) . '">';
}
}
return $result;
}
public function register_rank_math_cct_field_snippet() {
if ( ! class_exists( '\Jet_Engine\Modules\Custom_Content_Types\Module' ) ) {
return;
}
if ( ! function_exists( 'rank_math_register_var_replacement' ) ) {
return;
}
rank_math_register_var_replacement(
'jet_cct_field',
array(
'name' => esc_html__( 'Custom Content Type Field', 'jet-engine' ),
'description' => esc_html__( 'Custom Content Type Field value. Separate cct slug and field name with ::', 'jet-engine' ),
'variable' => 'jet_cct_field(cct-slug::field-name)',
'example' => esc_html__( 'Custom Content Type Field value', 'jet-engine' ),
),
array( $this, 'get_cct_field_value' )
);
}
public function get_cct_field_value( $field ) {
if ( empty( $field ) ) {
return null;
}
$field = str_replace( '::', '__', $field );
$value = jet_engine()->listings->data->get_prop( $field );
if ( is_array( $value ) ) {
return jet_engine_render_checkbox_values( $value );
}
return wp_kses_post( $value );
}
public function set_primary_term_first( $terms, $post_id, $settings ) {
if ( empty( $terms ) || is_wp_error( $terms ) ) {
return $terms;
}
$primary_term_id = null;
$tax = ! empty( $settings['from_tax'] ) ? $settings['from_tax'] : false;
if ( ! $tax ) {
return $terms;
}
if ( $this->is_rank_math_activated() ) {
$post_type = get_post_type( $post_id );
if ( ! $post_type ) {
return $terms;
}
$titles_options = get_option( 'rank-math-options-titles' );
$primary_tax_key = 'pt_' . $post_type . '_primary_taxonomy';
$primary_tax = ! empty( $titles_options[ $primary_tax_key ] ) ? $titles_options[ $primary_tax_key ] : false;
if ( ! $primary_tax || 'off' === $primary_tax || $primary_tax !== $tax ) {
return $terms;
}
$primary_term_id = get_post_meta( $post_id, 'rank_math_primary_' . $primary_tax, true );
} else if ( $this->is_yoast_activated() ) {
$primary_term_helper = new \Yoast\WP\SEO\Helpers\Primary_Term_Helper();
$primary_taxonomies = $primary_term_helper->get_primary_term_taxonomies( $post_id );
if ( empty( $primary_taxonomies ) || ! in_array( $tax, array_keys( $primary_taxonomies ) ) ) {
return $terms;
}
$primary_term_id = get_post_meta( $post_id, '_yoast_wpseo_primary_' . $tax, true );
}
if ( empty( $primary_term_id ) ) {
return $terms;
}
$terms_ids = wp_list_pluck( $terms, 'term_id' );
$find_index = array_search( $primary_term_id, $terms_ids );
if ( false === $find_index ) {
return $terms;
}
$primary_term = $terms[ $find_index ];
unset( $terms[ $find_index ] );
array_unshift( $terms, $primary_term );
return $terms;
}
}
}
new Jet_Engine_Seo_Package();