Skip to content

Instantly share code, notes, and snippets.

@wpmudev-sls
Created August 3, 2018 07:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wpmudev-sls/c6a354cc7b7b7da38bab127e6e17cf42 to your computer and use it in GitHub Desktop.
Save wpmudev-sls/c6a354cc7b7b7da38bab127e6e17cf42 to your computer and use it in GitHub Desktop.
[Smush] - Replace png to jpg in builder meta
<?php
/*
Plugin Name: Smush - Replace png to jpg in builder meta
Plugin URI: https://premium.wpmudev.org/
Description: Since Smush reaplaces all png to jpg in post content, some builders that store content in meta may have issues if original pngs are not kept. This plugin is usefull to set table and metakey so it will look through them and replace pngs to jpgs there too.
Author: Panos Lyrakis @ WPMUDEV
Author URI: https://premium.wpmudev.org/
License: GPLv2 or later
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'WPMUDEV_Smush_PNGJPG_In_Meta' ) ) {
class WPMUDEV_Smush_PNGJPG_In_Meta {
private static $_instance = null;
public static function get_instance() {
if( is_null( self::$_instance ) ){
self::$_instance = new WPMUDEV_Smush_PNGJPG_In_Meta();
}
return self::$_instance;
}
public function __construct() {
add_action( 'admin_menu', array(&$this, 'admin_menu') );
add_action( 'wp_ajax_wpmudev_smush_fetch_builder_meta', array( &$this, 'builder_meta_ajax' ) );
add_action( 'wp_ajax_wpmudev_smush_replace_builder_meta', array( &$this, 'builder_replace_png_ajax' ) );
}
public static function known_builders() {
$known_builders = array(
'zion' => array(
'title' => 'Zion Builder',
'table' => 'postmeta',
'indexer' => 'meta_id',
'key_column' => 'meta_key',
'value_column' => 'meta_value',
'key' => 'zn_page_builder_els'
)
);
return apply_filters(
'WPMUDEV_Smush_PNGJPG_In_Meta/known_builders',
$known_builders
);
}
public function admin_menu() {
if ( ! class_exists('WpSmushPngtoJpg') ) {
return;
}
add_submenu_page(
'smush', 'PNGtoJPG for Builders', 'PNGtoJPG for Builders', 'manage_options', 'wpmudev-pngjpg-builders', array(&$this, 'admin_page')
);
}
public function admin_page() {
?>
<h3>Check Png to Jpg for your builder</h3>
<?php
$known_builders = $this->add_custom_option( self::known_builders() );
$out = '';
$out .= $this->builders_html( $known_builders );
$out .= $this->results_html();
$out .= $this->js();
print $out;
}
public function builders_html( $builders ) {
$out = '<div id="builders-container">';
foreach ( $builders as $key => $builder ) {
$builder = (object)$builder;
$out .= "<div id='builder-{$key}' style='width: 100; padding: 20px; background: #eee;margin:5px;'>";
$out .= "<strong>{$builder->title}</strong>";
if ( isset( $builder->table ) && ! empty( $builder->table ) && isset( $builder->key ) && ! empty( $builder->key ) ){
$out .= " <a class='button-primary builder-fetch-png' data-builder_key='' data-table='{$builder->table}' data-indexer='{$builder->indexer}' data-key_column='{$builder->key_column}' data-value_column='{$builder->value_column}' data-key='{$builder->key}'>Check</a>";
}
else {
$out .= '<br />';
$out .= "<label>Custom table: ";
$out .= "<input type='text' id='custom-table-{$key}' />";
$out .= "</label> ";
//$out .= '<br />';
$out .= "<label>Custom indexer column: ";
$out .= "<input type='text' id='custom-indexer-{$key}' />";
$out .= "</label> ";
$out .= "<label>Custom key column: ";
$out .= "<input type='text' id='custom-key_column-{$key}' />";
$out .= "</label> ";
$out .= '<br />';
$out .= "<label>Custom value column: ";
$out .= "<input type='text' id='custom-value_column-{$key}' />";
$out .= "</label> ";
//$out .= '<br />';
$out .= "<label>Custom key name: ";
$out .= "<input type='text' id='custom-key-{$key}' />";
$out .= "</label> ";
$out .= '<br />';
$out .= "<a class='button-primary builder-fetch-png' data-builder_key='{$key}'>Check</a>";
}
$out .= "</div>";
}
return $out;
}
public function results_html() {
$out = '<div id="builders-meta-results" style="width: 100%; border: 2px solid #999; border-radius: 3px; background: #eee;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;">';
$out .= '<div id="results-placeholder" style="font-size: 28px; color: #555; width 100%; padding:10px; text-align:center;">Please choose one of the builders above</div>';
$out .= '</div>';
return $out;
}
public function js() {
$out = '';
ob_start();
?>
<script type="text/javascript">
(function($){
$(document).ready(function(){
var builder_fetcher = $('.builder-fetch-png'),
builder_results = $('#builders-meta-results'),
wpmudev_smush_builder_nonce = '<?php echo wp_create_nonce( 'wpmudev_smush_builder_nonce' ); ?>',
records,
column_data;
builder_fetcher.on( 'click', function(e){
e.preventDefault();
let table, key_column, indexer, value_column, key, me = $(this);
if ( '' == me.data('builder_key') ) {
table = me.data('table');
indexer = me.data( 'indexer' );
key_column = me.data('key_column');
value_column = me.data('value_column');
key = me.data('key');
}
else {
let bulder_key = me.data('key');
table = $('#custom-table-' + bulder_key ).val();
indexer = $('#custom-indexer-' + bulder_key ).val();
key_column = $('#custom-key_column-' + bulder_key ).val();
value_column = $('#custom-value_column-' + bulder_key ).val();
key = $('#custom-key-' + bulder_key ).val();
}
if ( '' == table || '' == indexer || '' == key_column || '' == value_column || '' == key ) {
alert( 'Something is missing' );
return;
}
builder_results.html( 'Checking <img src="<?php echo get_admin_url(); ?>/images/spinner.gif" />' );
ajax_data ={
action: 'wpmudev_smush_fetch_builder_meta',
nonce: wpmudev_smush_builder_nonce,
table: table,
indexer: indexer,
key_column: key_column,
value_column: value_column,
key: key,
};
// Set the global variable to use later on
column_data = {
table: table,
indexer: indexer,
key_column: key_column,
value_column: value_column,
key: key,
}
$.ajax({
type: "POST",
url: ajaxurl,
data: ajax_data,
dataType: "json",
success: function(resp){
if( resp.result == "_SUCCESS_" ) {
builder_results.html( resp.message );
records = jQuery.parseJSON( resp.records );
wpmudev_show_replace_records_button();
}
},
failure: function(errMsg) {
console.log(errMsg);
}
});
});
$(document).on( 'click', '#builder-replace-png', function(e){
e.preventDefault();
$(this).prop( "disabled", true ).hide(300);
wpmudev_replace_builder_pngs_ajax(0);
});
var wpmudev_replace_builder_pngs_ajax = function( current ){
//column_data
let meta_id = records[current],
max = records.length;
ajax_data ={
action: 'wpmudev_smush_replace_builder_meta',
nonce: wpmudev_smush_builder_nonce,
table: column_data.table,
indexer: column_data.indexer,
key_column: column_data.key_column,
value_column: column_data.value_column,
key: column_data.key,
meta_id: meta_id
};
$.ajax({
type: "POST",
url: ajaxurl,
data: ajax_data,
dataType: "json",
success: function(resp){
if( resp.result == "_SUCCESS_" ) {
builder_results.append( resp.message );
}
},
complete: function() {
current++;
if (current == max) {
//console.log('****___DONE____****');
builder_results.append( '<div style="text-align:center">****___DONE____****</div>' );
}
else
{
wpmudev_replace_builder_pngs_ajax(current);
}
},
failure: function(errMsg) {
console.log(errMsg);
}
});
}
function wpmudev_show_replace_records_button() {
let replace_btn = $('<a/>',{
id: 'builder-replace-png',
'class' : 'button-primary',
text: 'Replace those PNGS'
}).css('font-size', '18px');
let replace_wrap = $('<div />').css({'text-align':'center', 'padding': '10px'}).append( replace_btn );
builder_results.append( replace_wrap );
}
});
})(jQuery);
</script>
<?php
return ob_get_clean();
}
public function builder_replace_png_ajax() {
check_ajax_referer( 'wpmudev_smush_builder_nonce', 'nonce' );
if ( ! current_user_can( 'manage_options' ) ) {
$return = array(
'result' => '_FAIL_',
'message' => 'Not allowed to perform this action'
);
wp_send_json($return);
}
global $wpdb;
$table = filter_input( INPUT_POST, 'table', FILTER_DEFAULT );
$indexer = filter_input( INPUT_POST, 'indexer', FILTER_DEFAULT );
$key_column = filter_input( INPUT_POST, 'key_column', FILTER_DEFAULT );
$value_column = filter_input( INPUT_POST, 'value_column', FILTER_DEFAULT );
$key = filter_input( INPUT_POST, 'key', FILTER_DEFAULT );
$meta_id = filter_input( INPUT_POST, 'meta_id', FILTER_DEFAULT );
$table = $wpdb->prefix . $table;
$update_record = false;
$replaced_images = array();
$out = '';
$text = $wpdb->get_var( "SELECT {$value_column} FROM {$table} WHERE {$indexer}={$meta_id}" );
$img_regex = '/(http|https)?:\/\/[^ ]+?(?:\.png)/';
$img_regex = apply_filters( 'WPMUDEV_Smush_PNGJPG_In_Meta/image_regex', $img_regex );
preg_match_all($img_regex, $text, $matches);
foreach( $matches[0] as $png_image ) {
$jpg_image = str_replace( '.png', '.jpg', $png_image );
$image_data = @getimagesize( $jpg_image );
if ( is_array( $image_data ) && isset( $image_data['mime'] ) && 'image/jpeg' == $image_data['mime'] ) {
$text = str_replace( $png_image, $jpg_image, $text );
$replaced_images[$png_image] = $jpg_image;
$update_record = true;
}
}
if ( $update_record ) {
$record_updated = $wpdb->query( "UPDATE {$table} SET {$value_column}='{$text}' WHERE {$indexer}=$meta_id" );
if ( $record_updated ) {
$out .= "<div style='font-size:18px;width:100%;text-align:center;padding:10px;'>";
$out .= "<h5>In {$indexer} <big>{$meta_id}</big> following were replaced:</h5>";
if ( ! empty( $replaced_images ) ) {
foreach ( $replaced_images as $png => $jpg ) {
$out .= "<div><small>{$png} => {$jpg}</small></div>";
}
}
$out .= '</div>';
$return = array(
'result' => '_SUCCESS_',
'message' => $out
);
wp_send_json($return);
}
}
$out .= "<div style='font-size:18px;width:100%;text-align:center;padding:10px;'>";
$out .= "<h5>No images replaced in {$indexer} <big>{$meta_id}</big></h5>";
$out .= '</div>';
$return = array(
'result' => '_SUCCESS_',
'message' => $out
);
wp_send_json($return);
}
public function builder_meta_ajax() {
check_ajax_referer( 'wpmudev_smush_builder_nonce', 'nonce' );
if ( ! current_user_can( 'manage_options' ) ) {
$return = array(
'result' => '_FAIL_',
'message' => 'Not allowed to perform this action'
);
wp_send_json($return);
}
global $wpdb;
$table = filter_input( INPUT_POST, 'table', FILTER_DEFAULT );
$indexer = filter_input( INPUT_POST, 'indexer', FILTER_DEFAULT );
$key_column = filter_input( INPUT_POST, 'key_column', FILTER_DEFAULT );
$value_column = filter_input( INPUT_POST, 'value_column', FILTER_DEFAULT );
$key = filter_input( INPUT_POST, 'key', FILTER_DEFAULT );
$table = $wpdb->prefix . $table;
//$query = "SELECT {$indexer} FROM {$table} WHERE {$key_column}='{$key}' AND {$value_column} regexp '\.(jpe?g|png|gif)';";
$query = "SELECT {$indexer} FROM {$table} WHERE {$key_column}='{$key}' AND {$value_column} regexp '\.(png)';";
$results = $wpdb->get_col( $query );
if ( ! $results ) {
$return = array(
'result' => '_FAIL_',
'message' => 'Something went wrong'
);
}
else {
$count = count( $results );
$return = array(
'result' => '_SUCCESS_',
'message' => "<div style='font-size:24px;width:100%;text-align:center;padding:20px;'>There were <strong>{$count} records</strong> found containing <strong>PNG</strong> images in the <strong>{$table}</strong> table</div>",
'records' => json_encode( $results )
);
}
wp_send_json($return);
}
public function add_custom_option( $known_builders ) {
$custom_option = array(
'custom_option' => array(
'title' => 'Set custom table and column'
)
);
if ( ! is_array( $known_builders ) ) {
return $custom_option;
}
return array_merge( $known_builders, $custom_option );
}
}
if ( ! function_exists( 'wpmudev_smush_pngjpg_in_meta' ) ) {
function wpmudev_smush_pngjpg_in_meta() {
return WPMUDEV_Smush_PNGJPG_In_Meta::get_instance();
}
add_action( 'plugins_loaded', 'wpmudev_smush_pngjpg_in_meta', 10 );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment