Link to home
Start Free TrialLog in
Avatar of thtate
thtateFlag for United States of America

asked on

Manipulating wordpress plugin, regex mod possibly?

I am trying to modify embediframe plugin for word press. currently this plugin allows the users to enter [iframe url height width] in a page or post and it displays the iframe.

I would like to modify this plugin so the user only has to enter [url] and the iframe displays.

I am not going to be modifying the height and width of the iframe so these parameters are not neccessary nor desired. attached is the plugin code. i am not familiar enough with the preg_replace_callback function or regex or php for that matter.

any help will be greatly appreciated.

thanks!
<?php
include (dirname (__FILE__).'/plugin.php');
 
class EmbedIframe extends EmbedIframe_Plugin
{
	function EmbedIframe ()
	{
		$this->register_plugin ('embediframe', __FILE__);
		
		$this->add_filter ('the_content');
		$this->add_action ('wp_head');
	}
	
	function wp_head ()
	{
		
	}
	
	function replace ($matches)
	{
		$tmp = strpos ($matches[1], ' ');
		if ($tmp)
		{
			// Because the regex is such a nuisance
			$url  = substr ($matches[1], 0, $tmp);
			$rest = substr ($matches[1], strlen ($url));
			
			$width  = 800;
			$height = 875;
 
				$parts = array_values (array_filter (explode (' ', $rest)));
				$width = $parts[0];
				unset ($parts[0]);
				$height = implode (' ', $parts);
                       
			
			return $this->capture ('iframe', array ('url' => $url, 'width' => $width, 'height' => $height));
		}
		
		return '';
	}
 
	function the_content ($text)
	{
	  return preg_replace_callback ("@(?:<p>\s*)?\[iframe\s*(.*?)\](?:\s*</p>)?@", array (&$this, 'replace'), $text);
 
	}
}
 
$embediframe = new EmbedIframe;
?>

Open in new window

Avatar of James Rodgers
James Rodgers
Flag of Canada image

try replacing the embediframe.php with this

lets you set a default max size, so users can make it smaller if they want, but if no size is specified or  a size larger than you will allow it eill default to the max size


<?php
/*
Plugin Name: Embed Iframe
Plugin URI: http://blog.deskera.com/wordpress-plugin-embed-iframe
Description: Allows the insertion of code to display an external webpage within an iframe. The tag to insert the code is: <code>[iframe url width height]</code>
Version: 1.0
Author: Deskera
Author URI: http://deskera.com

1.0   - Initial release
*/


$iMaxHeight = 600;
$iMaxWidth      = 300;


include (dirname (__FILE__).'/plugin.php');

class EmbedIframe extends EmbedIframe_Plugin
{
      function EmbedIframe ()
      {
            $this->register_plugin ('embediframe', __FILE__);
            
            $this->add_filter ('the_content');
            $this->add_action ('wp_head');
      }
      
      function wp_head ()
      {
            
      }
      
      function replace ($matches)
      {
            $tmp = strpos ($matches[1], ' ');
            if ($tmp)
            {
                  // Because the regex is such a nuisance
                  $url  = substr ($matches[1], 0, $tmp);
                  $rest = substr ($matches[1], strlen ($url));
                  
                  $width  = 100;
                  $height = 200;
                  

                        $parts = array_values (array_filter (explode (' ', $rest)));
                        $width = $parts[0];
                        
                        unset ($parts[0]);
                        $height = implode (' ', $parts);

                  
                  return $this->capture ('iframe', array ('url' => $url, 'width' => ($width && $width<=$iMaxWidth ? $width : $iMaxWidth ), 'height' => ($height && $height<=$iMaxHeight ? $height : $iMaxHeight )));
            }
            
            return '';
      }

      function the_content ($text)
      {
        return preg_replace_callback ("@(?:<p>\s*)?\[iframe\s*(.*?)\](?:\s*</p>)?@", array (&$this, 'replace'), $text);
      }
}

$embediframe = new EmbedIframe;
?>
Avatar of thtate

ASKER

This is great so far, i did notice however , that if you dont enter a number or a space after the url, it breaks it, you have to at least leave a space before the closing bracet. is there a way to eliminate the need to leave a space after the url and also elimate the text "iframe" after the first bracet? so the code you are typing in the post would look like:

[http://youriframeurl.com]

thank you so much for your help!
not teh most elegant, but try this

<?php
/*
Plugin Name: Embed Iframe
Plugin URI: http://blog.deskera.com/wordpress-plugin-embed-iframe
Description: Allows the insertion of code to display an external webpage within an iframe. The tag to insert the code is: <code>[iframe url width height]</code>
Version: 1.0
Author: Deskera
Author URI: http://deskera.com

1.0   - Initial release
*/




include (dirname (__FILE__).'/plugin.php');

class EmbedIframe extends EmbedIframe_Plugin
{


      function EmbedIframe ()
      {
            $this->register_plugin ('embediframe', __FILE__);
            
            $this->add_filter ('the_content');
            $this->add_action ('wp_head');
      }
      
      function wp_head ()
      {
            
      }
      
      function replace ($matches)
      {
      $iDefHeight = 100;
      $iDefWidth  = 200;

      $iMaxHeight = 600;
      $iMaxWidth      = 500;
            $tmp = strpos ($matches[1], ' ');
            if(!$tmp){
                  $tmp = $matches[1];
                  $url=$tmp;
                  $rest='';
            }
            
            if ($tmp)
            {
                  // Because the regex is such a nuisance
                  if(!isset($url)){
                  $url  = substr ($matches[1], 0, $tmp);
                  }
                  if(!isset($rest)){
                  $rest = substr ($matches[1], strlen ($url));
                  }
                  $height = $iMaxHeight;
                  $width = $iMaxWidth;
                        $parts = array_values (array_filter (explode (' ', $rest)));
                        if($parts[0]){
                              $width = ($parts[0]< $iMaxWidth ? $parts[0] : $iMaxWidth) ;
                        }
                        
                        if($parts[1]){
                              $height = ($parts[1]< $iMaxHeight ? $parts[1] : $iMaxHeight) ;
                        }                        
                  echo "<br>h:".$height."<br>w:".$width;
                  
                  return $this->capture ('iframe', array ('url' => $url, 'width' => $width, 'height' => $height));
            }
            
            return '';
      }

      function the_content ($text)
      {
        return preg_replace_callback ("@(?:<p>\s*)?\[iframe\s*(.*?)\](?:\s*</p>)?@", array (&$this, 'replace'), $text);
      }
}

$embediframe = new EmbedIframe;
?>
ASKER CERTIFIED SOLUTION
Avatar of James Rodgers
James Rodgers
Flag of Canada image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
glad i could help


thanks for the points