Exclude links from preg_match_all/foreach that are commented out - php

I have a function in wordpress which finds links and changes them.
//FINDS ALL IMAGE LINKS
preg_match_all('/\S*\bwww\.tradingview\.com\S*/', $data['post_content'], $matches);
//FOR EACH IMAGE LINK IN THE CONTENT...
foreach( $matches[0] as $imgURL ):
I'm trying to make it so that it ignores any link that is commented out like this:
<!-- https://www.tradingview.com -->
I'm not sure how to accomplish this. I'm very new to web dev so apologies if I've left anything out.
Edit: I made a typo and added the ! in the first part of the comment
Edit: Here's the rest of my code, including the print statement.
function customPostSave($data , $postarr) {
// INCLUDES REQUIRED WP FILES
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
//FINDS ALL IMAGE LINKS
preg_match_all('/\S*\bwww\.tradingview\.com\S*/', $data['post_content'], $matches);
echo '<pre>', print_r($matches[0]), '</pre>';
//FOR EACH IMAGE LINK IN THE CONTENT...
foreach( $matches[0] as $imgURL ):
// REMOVES ALL SPACES AROUND THE URL
$imgURL = trim($imgURL);
// STORE ORIGINAL URL
$imgURLoriginal = $imgURL;
// PREPARES FILE INFORMATIONS
$file_array = array();
$file_array['name'] = basename($imgURL);
if( !preg_match('/(\.png)$/i', $imgURL) ) $file_array['name'] .= '.png';
$file_array['tmp_name'] = download_url($imgURL);
// DOWNLOADS THE IMAGE AND UPLOADS IT LOCALLY
$id = media_handle_sideload($file_array, $postarr['post_ID']);
$localURL = wp_get_attachment_url($id);
// GRABS THE POST TAGS
$tags = wp_get_object_terms($postarr['post_ID'], 'post_tag');
$imgTags = array();
if( !empty($tags) ):
foreach( $tags as $tag ):
array_push($imgTags, $tag->name);
endforeach;
endif;
// REPLACES THE IMAGE URL IN THE CONTENT, WITH <IMG> TAGS WITH SPECIFIC STYLES
$data['post_content'] = str_replace(
$imgURL,
'<!-- '.$imgURLoriginal.' -->
<p style="text-align:center"><img src="' . $localURL . '" alt="' . implode($imgTags, ', ') . '" style="width:100%;"></p>',
$data['post_content']
);
endforeach;
return $data;
} add_filter('wp_insert_post_data' , 'customPostSave' , '99', 2);

It is hard to provide you with a good answer due to lack of infomation. You should update your question with output from echo '<pre>', print_r($matches[0]), '</pre>'; so we know what data you are working with.
If all start with "<--", you can do it like this:
foreach($matches[0] as $imgURL) {
if(substr($imgURL, 0, 3) !== "<--") {
echo $imgURL;
}
}

Related

Shortcode code returns incorrect URL - Wordpress

I'm writing a WP shortcode to disaply random images from a path that's given by input.
[random-image pag="" class=""]
The code works nicely, but returns the correct url + the page i've put the shortcode.
Example:
I'm currently renovating my website locally.
The actual URL is: https://localhost/z/
But after I've finished coding it will become https://localhost/
If I put the shortcode on /prova page ( https://localhost/z/prova/ )
the image src will show "wp-content/themes/generatepress_child/img/home/2.jpg" which is correct but if I mouse over it it shows the full path like this:
"https://localhost/z**/prova/**wp-content/themes/generatepress_child/img/home/2.jpg" instead of "https://localhost/z/wp-content/themes/generatepress_child/img/home/2.jpg"
I've tried changing the $imagesDir in
$imagesDir = get_site_url() . 'wp-content/themes/generatepress_child/img/' . esc_attr($values['pag']) .'/';
or $imagesDir = 'z/wp-content/themes/generatepress_child/img/' . esc_attr($values['pag']) .'/';
or even: $imagesDir = 'https://localhost/z/wp-content/themes/generatepress_child/img/' . esc_attr($values['pag']) .'/';
But all of these return with
// Random img
function random_image( $atts, $content = null ) {
$values = shortcode_atts( array(
'pag' => 'home',
'class' => 'imgrnd',
), $atts );
$imagesDir = 'wp-content/themes/generatepress_child/img/' . esc_attr($values['pag']) .'/';
$images = glob($imagesDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
$randomImage = $images[array_rand($images)];
return '<img src="' . $randomImage . '" class="' . esc_attr($values['class']) . '">';
}
add_shortcode( 'random-image', 'random_image' );
I've solved this by changing the return output with
'<img src="' . '/z/' . $randomImage . '" class="' . esc_attr($values['class']) . '">';
But i still don't like this solution, is there a better way to fix it?

How to change wordpress img attributes

Am using Unveil plugin to lazy load images in wordpress. I would like to change the img attributes to something like this.
<img data-src="http://lorempixel.com/g/800/500/city/10" data-src-retina="http://lorempixel.com/g/1280/800/city/10" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" />
With this link I was able to achieve src now I kindly request someone to help on how to generate data-src and data-src-retina attributes.
Later I want to use them in my function in funtions.php
Bellow is my code snippet, but its not working only the src
function image_tag($html, $id, $alt, $title) {
//generate data url
$type = pathinfo($img, PATHINFO_EXTENSION);
$data = file_get_contents($img);
$src = 'data:image/' . $type . ';base64,' . base64_encode($data);
return preg_replace(array(
'/'.str_replace('//','//',get_bloginfo('url')).'/i',
'/s+width="d+"/i',
'/s+height="d+"/i',
'/alt=""/i'
),
array(
'data-src=" "',
'src="'.$src.'"',
'data-src-retina=" "',
'alt="' . $title . '"'
),
$html);
}
add_filter('get_image_tag', 'image_tag', 0, 4);

How to call thumbnail from image usign Types plugin in Wordpress

I am using Types plugin in Wordpress to create custom post type.
I have added custom filed "Image field" which is repeating field and in this way I want to create something like gallery in my post type
here is how I call the images in the front end
$images = get_post_meta(get_the_ID(), 'wpcf-application-image');
foreach ($images as $image) {
echo '<a rel="attachment" href="' . $image . '"><img src="' . $image . '" /></a>';
}
With that code I see the list with all images and link to the media file.
But how can I add a thumbnail instead of the exact image in the img tag?
Thank you!
If you only have the image url (not the id) then you can use a function like this to return the url (add it to functions.php etc):
/**
* Return an ID of an attachment by searching the database with the file URL.
*
* First checks to see if the $url is pointing to a file that exists in
* the wp-content directory. If so, then we search the database for a
* partial match consisting of the remaining path AFTER the wp-content
* directory. Finally, if a match is found the attachment ID will be
* returned.
*
* #param string $url The URL of the image (ex: http://example.com/wp-content/uploads/2013/05/test-image.jpg)
*
* #return int|null $attachment Returns an attachment ID, or null if no attachment is found
*/
function get_attachment_id_by_url( $url ) {
// Split the $url into two parts with the wp-content directory as the separator
$parsed_url = explode( parse_url( WP_CONTENT_URL, PHP_URL_PATH ), $url );
// Get the host of the current site and the host of the $url, ignoring www
$this_host = str_ireplace( 'www.', '', parse_url( home_url(), PHP_URL_HOST ) );
$file_host = str_ireplace( 'www.', '', parse_url( $url, PHP_URL_HOST ) );
// Return nothing if there aren't any $url parts or if the current host and $url host do not match
if ( ! isset( $parsed_url[1] ) || empty( $parsed_url[1] ) || ( $this_host != $file_host ) ) {
return;
}
// Now we're going to quickly search the DB for any attachment GUID with a partial path match
// Example: /uploads/2013/05/test-image.jpg
global $wpdb;
$attachment = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->prefix}posts WHERE guid RLIKE %s;", $parsed_url[1] ) );
// Returns null if no attachment is found
if(isset($attachment[0])) {
return $attachment[0];
} else {
return null;
}
}
Then you can use that ID to display the thumbnail:
$images = get_post_meta(get_the_ID(), 'wpcf-application-image');
foreach ($images as $image) {
$image_id = get_attachment_id_by_url($image);
echo '<a rel="attachment" href="' . $image . '"><img src="' . wp_get_attachment_image_src($image_id,'thumbnail') . '" /></a>';
}
Hi Simon and thank you for your help!
I added the code you posted but the images doesn't show up and I had
<img src="Array">
but you showed the the right way I and modified my code and now its work!
here is what I have:
function get_attachment_id_from_src ($image_src) {
global $wpdb;
$query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
$id = $wpdb->get_var($query);
return $id;
}
$images = get_post_meta(get_the_ID(), 'wpcf-application-image');
foreach ($images as $image) {
$image_src = get_attachment_id_from_src($image);
$image_thumb = wp_get_attachment_image ($image_src, 'medium');
echo '<a rel="attachment" href="' . $image . '">'. $image_thumb .'</a>';
}
Thanks again!

MediaWiki + Graphviz + Image maps + Pagelinks

Background: Working with MediaWiki 1.19.1, Graphviz 2.28.0, Extension:GraphViz 0.9 on WAMP stack (Server 2008, Apache 2.4.2, MySQL 5.5.27, PHP 5.4.5). Everything is working great and as expected for the basic functionality of rendering a clickable image from a Graphviz diagram using the GraphViz extension in MediaWiki.
Problem: The links in the image map are not added to the MediaWiki pagelinks table. I get why they aren't added but it becomes an issue if there is no way to follow the links back with the 'What links here' functionality.
Desired solution: During the processing of the diagram in the GraphViz extension, I would like to use the generated .map file to then create a list of wikilinks to add on the page to get picked up by MediaWiki and added to the pagelinks table.
Details:
This GraphViz extension code:
<graphviz border='frame' format='png'>
digraph example1 {
// define nodes
nodeHello [
label="I say Hello",
URL="Hello"
]
nodeWorld [
label="You say World!",
URL="World"
]
// link nodes
nodeHello -> nodeWorld!
}
</graphviz>
Generates this image:
And this image map code in a corresponding .map file on the server:
<map id="example1" name="example1">
<area shape="poly" id="node1" href="Hello" title="I say Hello" alt="" coords="164,29,161,22,151,15,137,10,118,7,97,5,77,7,58,10,43,15,34,22,31,29,34,37,43,43,58,49,77,52,97,53,118,52,137,49,151,43,161,37"/>
<area shape="poly" id="node2" href="World" title="You say World!" alt="" coords="190,125,186,118,172,111,152,106,126,103,97,101,69,103,43,106,22,111,9,118,5,125,9,133,22,139,43,145,69,148,97,149,126,148,152,145,172,139,186,133"/>
</map>
From that image map file, I would like to be able to extract the href and title to build wikilinks like so:
[[Hello|I say Hello]]
[[World|You say World!]]
I'm guessing that since that .map file is essentially XML that I could just use XPATH to query the file, but that is just a guess. PHP is not my strongest area and I don't know the best approach to going about the XML/XPATH option or if that is even the best approach to pull that info from the file.
Once I got that collection/array of wikilinks from the .map file, I'm sure I can hack up the GraphViz.php extension file to add it to the contents of the page to get it added to the pagelinks table.
Progress: I had a bit of an Rubber Duck Problem Solving moment right as I submitted the question. I realized that since I had well formed data in the image map, that XPATH was probably the way to go. It was fairly trivial to be able to pull the data I needed, especially since I found that the map file contents was stilled stored in a local string variable.
$xml = new SimpleXMLElement( $map );
foreach($xml->area as $item) {
$links .= "[[" . $item->attributes()->href . "|" . $item->attributes()->title . "]]";
}
Final Solution: See my accepted answer below.
Thanks for taking a look. I appreciate any assistance or direction you can offer.
I finally worked through all of the issues and now have a fairly decent solution to render the graph nicely, provide a list of links, and register the links with wiki. My solution doesn't fully support all of the capabilities of the current GraphViz extension as it is written as there is functionality we do not need and I do not want to support. Here are the assumptions / limitations of this solution:
Does not support MscGen: We only have a need for Graphviz.
Does not support imageAtrributes: We wanted to control the format and presentation and it seemed like there were inconsistencies in the imageAttributes implementation that would then cause further support issues.
Does not support wikilinks: While it would be nice to provide consistent link usage through wiki and the Graphviz extension, the reality is that Graphviz is a completely different markup environment. While the current extension 'supports' wikilinks, the implementation is a little weak and leaves areas for confusion. Example: Wikilinks support giving the link an optional description but Graphviz already uses the node label for the description. So then you end up ignoring the wikilink description and telling users that 'Yes, we support wikilinks but don't use the description part' So since we aren't really using wikilinks correctly, just implement a regular link implementation and try to avoid the confusion entirely.
Here is what the output looks like:
Here are the changes that were made
Comment out this line:
// We don't want to support wikilinks so don't replace them
//$timelinesrc = rewriteWikiUrls( $timelinesrc ); // if we use wiki-links we transform them to real urls
Replace this block of code:
// clean up map-name
$map = preg_replace( '#<ma(.*)>#', ' ', $map );
$map = str_replace( '</map>', '', $map );
if ( $renderer == 'mscgen' ) {
$mapbefore = $map;
$map = preg_replace( '/(\w+)\s([_:%#/\w]+)\s(\d+,\d+)\s(\d+,\d+)/',
'<area shape="$1" href="$2" title="$2" alt="$2" coords="$3,$4" />',
$map );
}
/* Procduce html
*/
if ( $wgGraphVizSettings->imageFormatting )
{
$txt = imageAtrributes( $args, $storagename, $map, $outputType, $wgUploadPath ); // if we want borders/position/...
} else {
$txt = '<map name="' . $storagename . '">' . $map . '</map>' .
'<img src="' . $wgUploadPath . '/graphviz/' . $storagename . '.' . $outputType . '"' .
' usemap="#' . $storagename . '" />';
}
With this code:
$intHtml = '';
$extHtml = '';
$badHtml = '';
// Wrap the map/area info with top level nodes and load into xml object
$xmlObj = new SimpleXMLElement( $map );
// What does map look like before we start working with it?
wfDebugLog( 'graphviz', 'map before: ' . $map . "\n" );
// loop through each of the <area> nodes
foreach($xmlObj->area as $areaNode) {
wfDebugLog( 'graphviz', "areaNode: " . $areaNode->asXML() . "\n" );
// Get the data from the XML attributes
$hrefValue = (string)$areaNode->attributes()->href;
$textValue = (string)$areaNode->attributes()->title;
wfDebugLog( 'graphviz', '$hrefValue before: ' . $hrefValue . "\n" );
wfDebugLog( 'graphviz', '$textValue before: ' . $textValue . "\n" );
// For the text fields, multiple spaces (" ") in the Graphviz source (label)
// turns into a regular space followed by encoded representations of
// non-breaking spaces ("   ") in the .map file which then turns
// into the following in the local variables: ("   ").
// The following two options appear to convert/decode the characters
// appropriately. Leaving the lines commented out for now, as we have
// not seen a graph in the wild with multiple spaces in the label -
// just happened to stumble on the scenario.
// See http://www.php.net/manual/en/simplexmlelement.asxml.php
// and http://stackoverflow.com/questions/2050723/how-can-i-preg-replace-special-character-like-pret-a-porter
//$textValue = iconv("UTF-8", "ASCII//TRANSLIT", $textValue);
//$textValue = html_entity_decode($textValue, ENT_NOQUOTES, 'UTF-8');
// Now we need to deal with the whitespace characters like tabs and newlines
// and also deal with them correctly to replace multiple occurences.
// Unfortunately, the \n and \t values in the variable aren't actually
// tab or newline characters but literal characters '\' + 't' or '\' + 'n'.
// So the normally recommended regex '/\s+/u' to replace the whitespace
// characters does not work.
// See http://stackoverflow.com/questions/6579636/preg-replace-n-in-string
$hrefValue = preg_replace("/( |\\\\n|\\\\t)+/", ' ', $hrefValue);
$textValue = preg_replace("/( |\\\\n|\\\\t)+/", ' ', $textValue);
// check to see if the url matches any of the
// allowed protocols for external links
if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $hrefValue ) ) {
// external link
$parser->mOutput->addExternalLink( $hrefValue );
$extHtml .= Linker::makeExternalLink( $hrefValue, $textValue ) . ', ';
}
else {
$first = substr( $hrefValue, 0, 1 );
if ( $first == '\\' || $first == '[' || $first == '/' ) {
// potential UNC path, wikilink, absolute or relative path
$hrefValue = '#InvalidLink';
$badHtml .= Linker::makeExternalLink( $hrefValue, $textValue ) . ', ';
$textValue = 'Invalid link. Check Graphviz source.';
}
else {
$title = Title::newFromText( $hrefValue );
if ( is_null( $title ) ) {
// invalid link
$hrefValue = '#InvalidLink';
$badHtml .= Linker::makeExternalLink( $hrefValue, $textValue ) . ', ';
$textValue = 'Invalid link. Check Graphviz source.';
}
else {
// internal link
$parser->mOutput->addLink( $title );
$intHtml .= Linker::link( $title, $textValue ) . ', ';
$hrefValue = $title->getFullURL();
}
}
}
$areaNode->attributes()->href = $hrefValue;
$areaNode->attributes()->title = $textValue;
}
$map = $xmlObj->asXML();
// The contents of $map, which is now XML, gets embedded
// in the HTML sent to the browser so we need to strip
// the XML version tag and we also strip the <map> because
// it will get replaced with a new one with the correct name.
$map = str_replace( '<?xml version="1.0"?>', '', $map );
$map = preg_replace( '#<ma(.*)>#', ' ', $map );
$map = str_replace( '</map>', '', $map );
// Let's see what it looks like now that we are done with it.
wfDebugLog( 'graphviz', 'map after: ' . $map . "\n" );
$txt = '' .
'<table style="background-color:#f9f9f9;border:1px solid #ddd;">' .
'<tr>' .
'<td style="border:1px solid #ddd;text-align:center;">' .
'<map name="' . $storagename . '">' . $map . '</map>' .
'<img src="' . $wgUploadPath . '/graphviz/' . $storagename . '.' . $outputType . '"' . ' usemap="#' . $storagename . '" />' .
'</td>' .
'</tr>' .
'<tr>' .
'<td style="font:10px verdana;">' .
'This Graphviz diagram links to the following pages:' .
'<br /><strong>Internal</strong>: ' . ( $intHtml != '' ? rtrim( $intHtml, ' ,' ) : '<em>none</em>' ) .
'<br /><strong>External</strong>: ' . ( $extHtml != '' ? rtrim( $extHtml, ' ,' ) : '<em>none</em>' ) .
( $badHtml != '' ? '<br /><strong>Invalid</strong>: ' . rtrim($badHtml, ' ,') .
'<br /><em>Tip: Do not use wikilinks ([]), UNC paths (\\) or relative links (/) when creating links in Graphviz diagrams.</em>' : '' ) .
'</td>' .
'</tr>' .
'</table>';
Possible enhancements:
It would be nice if the list of links below the graph were sorted and de-duped.

Can't read txt file correctly to PHP array

I have working script that shows YouTube videos on page but I need it to read addresses in array from separate(txt) file. I tried several solutions but have not yet found a single working one.
Any help from smarter people!
My working code is using array like this:
$video = array('JObJ7vuppGE', 'BsmE6leTbkc', 'zWtj4TEVLvU');// array of youtube videos
What I planning to use instead:
$tube = $_SERVER['DOCUMENT_ROOT'] .'/youtube.txt';// IDs of youtube videos inside
$lines = file($tube);
foreach($lines as $line_num => $line)
$video = array($line);// array of youtube videos
$v = preg_replace("/[^A-Za-z0-9\-\_]/", "", $_GET["v"]); // make sure "v" parameter is sanitized
if(!empty($v) && in_array($v, $video)) //check if parameter "v" is empty and is yours video
{
echo '<object width="853" height="505"><param name="movie" value="http://www.youtube.com/v/' . $v . '&hl=en_US&fs=1&hd=1&color1=0xe1600f&color2=0xfebd01"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>
<embed src="http://www.youtube.com/v/' . $v . '&hl=en_US&fs=1&hd=1&color1=0xe1600f&color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="853" height="505"></embed>
</object>';
}
else
{
foreach($video as $v)
{
echo '<div class="tube">
<a href="/sites/tube.php?v=' . $v . '" class="thickbox">
<img style="border: 2px solid #000; margin: 5px;" alt="" src="http://i1.ytimg.com/vi/' . $v . '/default.jpg"/>
</a>';
$xmlData = simplexml_load_string(utf8_encode(file_get_contents('http://gdata.youtube.com/feeds/api/videos/' . $v . '?fields=title,yt:recorded')));
$title = (string)$xmlData->title;
$entry = $xmlData;
$namespaces = $entry->getNameSpaces(true);
$yr = $entry->children((string)$namespaces['yt']);
// get <yt:recorded> node for date and replace yyyy-mm-dd to dd.mm.yyyy
$year = substr($yr->recorded, 0, 4);
$month = substr($yr->recorded, 5, 2);
$day = substr($yr->recorded, 8, 2);
$recorddate = $day . "." . $month . "." . $year;
echo '<p>' . $recorddate . '<br>' . $title . '<br>
</p>
</div>';
}
}
unfortunately I am able to read only first line of txt file. At least I can only show the first video in page. My approach is obviously wrong.
And don`t tell, I now my code is mess. Feel free to modify and improve it, as long as it still works as planned.
I just copied your code across to my local install of XAMPP.
Without a 'v' parameter in the Query String, a list of videos were shown, each displaying a thumbnail and title and within a link which redirected back to the same page, but with a 'v' parameter included.
Clicking the thumbnail loaded the page showing a YouTube player for the selected video.
I see no problems here...
what i understand from your question you want to read video id from multiple files and combine it into one php array? AM i correct?
Also i suggest using Zend_gdata api for youtube functionality its simple with many other options you can try
I think the main idea / question was to store the ids in a txt file and read them rather than having them stored in an array right?
<?php
/**
* #author - Sephedo
* #for - dogcat # Stackoverflow
* #question - http://stackoverflow.com/questions/6936958/cant-read-txt-file-correctly-to-php-array
*/
$filename = "youtube.txt";
// Open the file
if( $handle = #fopen( $filename, "r") )
{
// Cycle each line until end
while(! feof( $handle ) )
{
$line = fgets($handle); // Read the line
$youtube[] = $line;
}
}
if(! isset( $youtube ) ) $youtube = array();
foreach( $youtube as $videoId )
{
echo $videoId; // Etc etc etc.....
}
?>

Categories