Customs tokens from Client Reports brokens in Pro

Hi,

After switching from MainWP Client Reports to Pro Reports, I’m trying to reuse some custom tokens I made for Client.

Only 2 tokens are working, the ones who are “simples” (for example : [translations.updates]).

The others are custom sections (nested tokens), like :

[section.my_plugin_section]
    [my_custom_plugin_token]
[section.my_plugin_section]

And I can’t get thoses to work again.

I replaced those filters :
mainwp_client_reports_tokens_groups => mainwp_pro_reports_tokens_groups

mainwp_client_reports_tokens_nav_top => mainwp_pro_reports_tokens_nav_top (look like this one doesn’t exists in Pro)

mainwp_client_reports_custom_tokens => mainwp_pro_reports_custom_tokens

I think the problem is with mainwp_pro_reports_custom_tokens.
That filter is supposed to return the $tokens_values.
My “simple” tokens, which are working in pro, are returned inside $tokens_values.

However, for my sections, I had a something more tricky, I don’t remember if it was the official way to do that in Client Reports :

I replaced (str_replace) my tokens by the values directly in $report->body.

Apparently $report->body does not exists anymore in Pro.

How can I add a custom section in Pro Reports ?
Is there a doc/official way to do that somewhere ?

Thanks a lot :exploding_head:

Hi @FLX,

Can you please post your code snippet in full so I can have our dev team review it?

1 Like

Thanks Bogdan,

Here is the full code :

use \MainWP\Dashboard\MainWP_DB;

class ADECUpdatesReport{

    public static $sections = [
        [
            'name' => 'section.adec_plugin_updates',
            'desc' => 'Liste les plugins ayant une mise à jour disponible'
        ],
        [
            'name' => 'section.adec_tpl_updates',
            'desc' => 'Liste les templates ayant une mise à jour disponible'
        ]
    ];

    public static $navTokenGroups = [
        'sections' => 'Sections',
        'adec_plugin_updates' => 'Plugins updates',
        'adec_tpl_updates' => 'Templates updates',
        'adec_tokens' => 'Autres tokens'
    ];

    public static $pluginsTokens = [
        ['name' => 'plugin.name', 'desc' => 'Nom du plugin'],
        ['name' => 'plugin.current_version', 'desc' => 'Version actuelle du plugin'],
        ['name' => 'plugin.new_version', 'desc' => 'Nouvelle version disponible']
    ];

    public static $tplTokens = [
        ['name' => 'template.name', 'desc' => 'Nom du template'],
        ['name' => 'template.current_version', 'desc' => 'Version actuelle du template'],
        ['name' => 'template.new_version', 'desc' => 'Nouvelle version du template']
    ];

    public static $otherTokens = [
        ['name' => 'core.version_status', 'desc' => 'Texte WP Core a jour ou pas'],
        ['name' => 'translations.updates', 'desc' => 'Liste les mises à jour traductions disponibles']
    ];

    public static function addADECNavGroup($tokens_groups){
        $tokens_groups['adec_tokens'] = 'ADEC Tokens';
        return $tokens_groups;
    }

    public static function getWebsiteUpdatesList($site_id){
        $website = MainWP_DB::instance()->get_website_by_id($site_id);
        
        $wp_upgrades            = json_decode( MainWP_DB::instance()->get_website_option( $website, 'wp_upgrades' ), true );
        $plugin_upgrades        = json_decode( $website->plugin_upgrades, true );
        $theme_upgrades         = json_decode( $website->theme_upgrades, true );
        $translation_upgrades   = json_decode( $website->translation_upgrades, true );
        $result = [
            'wp_core'     => $wp_upgrades,
            'plugins'     => $plugin_upgrades,
            'themes'      => $theme_upgrades,
            'translation' => $translation_upgrades,
        ];
        return $result;
    }

    public static function replaceTemplateTokens($txt, $tpl){
        $tokens = [
            '[template.name]' => $tpl['Name'],
            '[template.current_version]' => $tpl['Version'],
            '[template.new_version]' => (!empty($tpl['update'])) ? $tpl['update']['new_version'] : '',
        ];
        $r = $txt;
        foreach($tokens as $token => $val){
            $r = str_replace($token, $val, $r);
        }
        return $r;
    }

    public static function replacePluginTokens($txt, $plugin){
        $tokens = [
            '[plugin.name]' => $plugin['Name'],
            '[plugin.current_version]' => $plugin['Version'],
            '[plugin.new_version]' => (!empty($plugin['update'])) ? $plugin['update']['new_version'] : '',
        ];
        $r = $txt;
        foreach($tokens as $token => $val){
            $r = str_replace($token, $val, $r);
        }
        return $r;
    }
}


function addTokenGroups ($tokens) {

    // Add sections
    foreach(ADECUpdatesReport::$sections as  $section){
        $tokens['adec_tokens']['sections'][] = $section;
    }

    // Add sections groups
    foreach(ADECUpdatesReport::$navTokenGroups as $group_slug => $group_name){
        $tokens['adec_tokens']['nav_group_tokens'][$group_slug] = $group_name;
    }

    // Add plugins tokens
    foreach(ADECUpdatesReport::$pluginsTokens as $tokenData){
        $tokens['adec_tokens']['adec_plugin_updates'][] = $tokenData;
    }

    // Add templates tokens
    foreach(ADECUpdatesReport::$tplTokens as $tokenData){
        $tokens['adec_tokens']['adec_tpl_updates'][] = $tokenData;
    }

    foreach(ADECUpdatesReport::$otherTokens as $tokenData){
        $tokens['adec_tokens']['adec_tokens'][] = $tokenData;
    }
    
    return $tokens;
}
add_filter('mainwp_client_reports_tokens_groups', 'addTokenGroups');
add_filter('mainwp_pro_reports_tokens_groups', 'addTokenGroups');


// Add main nav group
add_filter('mainwp_client_reports_tokens_nav_top', ['ADECUpdatesReport', 'addADECNavGroup']);
add_filter('mainwp_pro_reports_tokens_nav_top', ['ADECUpdatesReport', 'addADECNavGroup']);


// token values
add_filter('mainwp_client_reports_custom_tokens', 'ADEC_custom_reports_custom_tokens', 10, 3);
add_filter('mainwp_pro_reports_custom_tokens', 'ADEC_custom_reports_custom_tokens', 10, 3);
function ADEC_custom_reports_custom_tokens($tokens_values, $report, $site) {
    
    $updates = ADECUpdatesReport::getWebsiteUpdatesList($site['id']);

    // CORE UPDATE TOKEN
    $tokens_values['[core.version_status]'] = (empty($updates['wp_core']))
        ? '✅ Le core est à jour'
        : "⚠️ Le core n'est pas à jour. (Version actuelle : ".$updates['wp_core']['current'].". Nouvelle version : <b>".$updates['wp_core']['new']."</b>)";
    
    
    // CUSTOM LOOP TEMPLATES UPDATES
    $updates_regex = '/(\[section\.adec_tpl_updates\])(.*?)(\[\/section\.adec_tpl_updates\])/is';
    if ( preg_match_all( $updates_regex, $report->body, $matches ) ) {
        $section_content = '';
        if(empty($updates['themes'])){
            $section_content = ' ✅ <b>Tous les thèmes sont à jour</b><br>';

        }else{
            $replaced_content = '⚠️ <b>Des mises à jour de thèmes sont disponibles</b><br>';

            foreach($updates['themes'] as $tpl){
                $replaced_content .= ADECUpdatesReport::replaceTemplateTokens($matches[2][0], $tpl);
            }
            $section_content = $replaced_content;
        }
        
        $body = str_replace(
            ['[section.adec_tpl_updates]', '[/section.adec_tpl_updates]'],
            '',
            $report->body
        );
        $body = str_replace($matches[2], $section_content, $body);
        $report->body = $body;
    }

    // CUSTOM LOOP PLUGINS UPDATES
    $updates_regex = '/(\[section\.adec_plugin_updates\])(.*?)(\[\/section\.adec_plugin_updates\])/is';
    if ( preg_match_all( $updates_regex, $report->body, $matches ) ) {
        $section_content = '';
        if(empty($updates['plugins'])){
            $section_content = ' ✅ <b>Tous les plugins sont à jour</b><br>';

        }else{
            $replaced_content = '⚠️ <b>Des mises à jour de plugins sont disponibles</b><br>';

            foreach($updates['plugins'] as $plug){
                $replaced_content .= ADECUpdatesReport::replacePluginTokens($matches[2][0], $plug);
            }
            $section_content = $replaced_content;
        }
        
        $body = str_replace(
            ['[section.adec_plugin_updates]', '[/section.adec_plugin_updates]'],
            '',
            $report->body
        );
        $body = str_replace($matches[2], $section_content, $body);
        $report->body = $body;
    }
    
    // TRANSLATIONS UPDATES TOKEN
    $translation_txt .= '';
    if(empty($updates['translation'])){
        $translation_txt .= ' ✅ Toutes les traductions sont à jour';
    }else{
        foreach($updates['translation'] as $trans){
            $translation_txt .= 'Une mise à jour de traduction (<b>'.$trans['language'].'</b>) est disponible pour <b>'.$trans['name'].' '.$trans['version'].'</b><br>';
        }
    }
    $tokens_values['[translations.updates]'] = $translation_txt;
    
    return $tokens_values;
}

Thanks Felix,

I will let you know what our Dev team finds as soon as possible.

1 Like

Thanks a lot :+1:

Maybe i’m overthink this and instead of tokens I could just use a good old shortcode ? :thinking:

Hi Felix,

Here is the update:

<?php
use \MainWP\Dashboard\MainWP_DB;

class ADECUpdatesReport {

	public static $sections = array(
		array(
			'name' => 'section.adec_plugin_updates',
			'desc' => 'Liste les plugins ayant une mise à jour disponible',
		),
		array(
			'name' => 'section.adec_tpl_updates',
			'desc' => 'Liste les templates ayant une mise à jour disponible',
		),
	);

	public static $navTokenGroups = array(
		'sections'            => 'Sections',
		'adec_plugin_updates' => 'Plugins updates',
		'adec_tpl_updates'    => 'Templates updates',
		'adec_tokens'         => 'Autres tokens',
	);

	public static $pluginsTokens = array(
		array(
			'name' => 'plugin.name',
			'desc' => 'Nom du plugin',
		),
		array(
			'name' => 'plugin.current_version',
			'desc' => 'Version actuelle du plugin',
		),
		array(
			'name' => 'plugin.new_version',
			'desc' => 'Nouvelle version disponible',
		),
	);

	public static $tplTokens = array(
		array(
			'name' => 'template.name',
			'desc' => 'Nom du template',
		),
		array(
			'name' => 'template.current_version',
			'desc' => 'Version actuelle du template',
		),
		array(
			'name' => 'template.new_version',
			'desc' => 'Nouvelle version du template',
		),
	);

	public static $otherTokens = array(
		array(
			'name' => 'core.version_status',
			'desc' => 'Texte WP Core a jour ou pas',
		),
		array(
			'name' => 'translations.updates',
			'desc' => 'Liste les mises à jour traductions disponibles',
		),
	);

	public static function addADECNavGroup( $tokens_groups ) {
		$tokens_groups['adec_tokens'] = 'ADEC Tokens';
		return $tokens_groups;
	}

	public static function getWebsiteUpdatesList( $site_id ) {
		$website = MainWP_DB::instance()->get_website_by_id( $site_id );

		$wp_upgrades          = json_decode( MainWP_DB::instance()->get_website_option( $website, 'wp_upgrades' ), true );
		$plugin_upgrades      = json_decode( $website->plugin_upgrades, true );
		$theme_upgrades       = json_decode( $website->theme_upgrades, true );
		$translation_upgrades = json_decode( $website->translation_upgrades, true );
		$result               = array(
			'wp_core'     => $wp_upgrades,
			'plugins'     => $plugin_upgrades,
			'themes'      => $theme_upgrades,
			'translation' => $translation_upgrades,
		);
		return $result;
	}

	public static function replaceTemplateTokens( $txt, $tpl ) {
		$tokens = array(
			'[template.name]'            => $tpl['Name'],
			'[template.current_version]' => $tpl['Version'],
			'[template.new_version]'     => ( ! empty( $tpl['update'] ) ) ? $tpl['update']['new_version'] : '',
		);
		$r      = $txt;
		foreach ( $tokens as $token => $val ) {
			$r = str_replace( $token, $val, $r );
		}
		return $r;
	}

	public static function replacePluginTokens( $txt, $plugin ) {
		$tokens = array(
			'[plugin.name]'            => $plugin['Name'],
			'[plugin.current_version]' => $plugin['Version'],
			'[plugin.new_version]'     => ( ! empty( $plugin['update'] ) ) ? $plugin['update']['new_version'] : '',
		);
		$r      = $txt;
		foreach ( $tokens as $token => $val ) {
			$r = str_replace( $token, $val, $r );
		}
		return $r;
	}
}


function addTokenGroups( $tokens ) {

	// Add sections
	foreach ( ADECUpdatesReport::$sections as  $section ) {
		$tokens['adec_tokens']['sections'][] = $section;
	}

	// Add sections groups
	foreach ( ADECUpdatesReport::$navTokenGroups as $group_slug => $group_name ) {
		$tokens['adec_tokens']['nav_group_tokens'][ $group_slug ] = $group_name;
	}

	// Add plugins tokens
	foreach ( ADECUpdatesReport::$pluginsTokens as $tokenData ) {
		$tokens['adec_tokens']['adec_plugin_updates'][] = $tokenData;
	}

	// Add templates tokens
	foreach ( ADECUpdatesReport::$tplTokens as $tokenData ) {
		$tokens['adec_tokens']['adec_tpl_updates'][] = $tokenData;
	}

	foreach ( ADECUpdatesReport::$otherTokens as $tokenData ) {
		$tokens['adec_tokens']['adec_tokens'][] = $tokenData;
	}

	return $tokens;
}
add_filter( 'mainwp_client_reports_tokens_groups', 'addTokenGroups' );
add_filter( 'mainwp_pro_reports_tokens_groups', 'addTokenGroups' );


// Add main nav group
add_filter( 'mainwp_client_reports_tokens_nav_top', array( 'ADECUpdatesReport', 'addADECNavGroup' ) );
add_filter( 'mainwp_pro_reports_tokens_nav_top', array( 'ADECUpdatesReport', 'addADECNavGroup' ) );


// token values
add_filter( 'mainwp_client_reports_custom_tokens', 'ADEC_custom_reports_custom_tokens', 10, 3 );
add_filter( 'mainwp_pro_reports_custom_tokens', 'ADEC_custom_reports_custom_tokens', 10, 4 );
function ADEC_custom_reports_custom_tokens( $tokens_values, $report, $site, $templ_content = '' ) {

	$updates = ADECUpdatesReport::getWebsiteUpdatesList( $site['id'] );

	// CORE UPDATE TOKEN
	$tokens_values['[core.version_status]'] = ( empty( $updates['wp_core'] ) )
		? '✅ Le core est à jour'
		: "⚠️ Le core n'est pas à jour. (Version actuelle : " . $updates['wp_core']['current'] . '. Nouvelle version : <b>' . $updates['wp_core']['new'] . '</b>)';

	// CUSTOM LOOP TEMPLATES UPDATES
	$updates_regex = '/(\[section\.adec_tpl_updates\])(.*?)(\[\/section\.adec_tpl_updates\])/is';
	if ( preg_match_all( $updates_regex, $templ_content, $matches ) ) {
		$section_content = '';
		if ( empty( $updates['themes'] ) ) {
			$section_content = ' ✅ <b>Tous les thèmes sont à jour</b><br>';

		} else {
			$replaced_content = '⚠️ <b>Des mises à jour de thèmes sont disponibles</b><br>';

			foreach ( $updates['themes'] as $tpl ) {
				$replaced_content .= ADECUpdatesReport::replaceTemplateTokens( $matches[2][0], $tpl );
			}
			$section_content = $replaced_content;
		}

		$body         = str_replace(
			array( '[section.adec_tpl_updates]', '[/section.adec_tpl_updates]' ),
			'',
			$templ_content
		);
		$body         = str_replace( $matches[2], $section_content, $body );
		$templ_content = $body;
	}

	// CUSTOM LOOP PLUGINS UPDATES
	$updates_regex = '/(\[section\.adec_plugin_updates\])(.*?)(\[\/section\.adec_plugin_updates\])/is';
	if ( preg_match_all( $updates_regex, $templ_content, $matches ) ) {
		$section_content = '';
		if ( empty( $updates['plugins'] ) ) {
			$section_content = ' ✅ <b>Tous les plugins sont à jour</b><br>';

		} else {
			$replaced_content = '⚠️ <b>Des mises à jour de plugins sont disponibles</b><br>';

			foreach ( $updates['plugins'] as $plug ) {
				$replaced_content .= ADECUpdatesReport::replacePluginTokens( $matches[2][0], $plug );
			}
			$section_content = $replaced_content;
		}

		$body         = str_replace(
			array( '[section.adec_plugin_updates]', '[/section.adec_plugin_updates]' ),
			'',
			$templ_content
		);
		$body         = str_replace( $matches[2], $section_content, $body );
		$templ_content = $body;
	}

	// TRANSLATIONS UPDATES TOKEN
	$translation_txt .= '';
	if ( empty( $updates['translation'] ) ) {
		$translation_txt .= ' ✅ Toutes les traductions sont à jour';
	} else {
		foreach ( $updates['translation'] as $trans ) {
			$translation_txt .= 'Une mise à jour de traduction (<b>' . $trans['language'] . '</b>) est disponible pour <b>' . $trans['name'] . ' ' . $trans['version'] . '</b><br>';
		}
	}
	$tokens_values['[translations.updates]'] = $translation_txt;

	return $tokens_values;
}
1 Like

Thanks,

So I tried this, it works better (the template is not destroyed like before),
but I can’t get my values to show.

Previously, just modifying $report-body was enough to apply changes to the template, it was probably passed by reference.

With this version, modifications to $templ_content are not applied.

I’m currently trying to return the content with $tokens_values.

But maybe i’ll just replace these tokens with simples like [translations.updates], because it works perfectly,
and sections were more useful in Client Reports because it was just a textarea, now we can do that directly in the php file :thinking:

Ok, let us know how it goes.

2 Likes

It’s perfect with only shortcodes, way eastier than dealing with those nested sections :ok_hand:

1 Like

This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.