Reputation: 1293
I have a function to display a list of files from a given directory as links. I then have a shortcode to display the function, but I can't figure out how to make the shortcode work without using inline php to call the function. The shortcode only works right now because I have another third-party plugin that allows inline php in the WordPress text editor.
Here's the function:
function showFiles($path){
if ($handle = opendir($path))
{
$up = substr($path, 0, (strrpos(dirname($path."/."),"/")));
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..")
{
$fName = $file;
$file = $path.'/'.$file;
if(is_file($file)) {
echo "<li><a href='/".$file."' target=_blank>".$fName."</a></li>";
}
}
}
closedir($handle);
}
}
And here's a pared down version of the shortcode function I'm using:
function sc_showfiles( $atts, $content = null ) {
extract( shortcode_atts( array(
'type' => '',
), $atts ) );
$showfiles = '<ul><?php showFiles(\'files/'.$type.'files/'.do_shortcode($content).'\'); ?></ul>';
return $showfiles;
}
add_shortcode('showfiles', 'sc_showfiles');
The content area allows the user to enter a shortcode with a user generated meta so the directory it's pulling from will match the logged in user.
I've tried about six different things, and haven't been able to achieve this without calling the showFiles function using inline php. I came close once using:
$files = showFiles('files/'.$type.'files/'.do_shortcode($content).);
and
$showfiles = '<ul>'.$files.'</ul>';
return $showfiles;
but that threw the list of files at the top of the page, I assume because the original showFiles function is echoing the html output. But if I change echo to return in the top function I get nothing.
//////////////////// FINAL WORKING CODE ///////////////////////////
With thanks to FaddishWorm for his help.
function showFiles($path){
if ($handle = opendir($path))
{
$up = substr($path, 0, (strrpos(dirname($path."/."),"/")));
$thefiles .= '<span class="checkmarks"><ul>';
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != ".." && $file !== "index.html")
{
$fName = $file;
$file = $path.'/'.$file;
if(is_file($file)) {
$thefiles .= "<li><a href='/".$file."' target=_blank>".$fName."</a></li>";
}
}
}
closedir($handle);
$thefiles .= '</ul></span>';
return $thefiles;
}
}
function sc_showfiles( $atts, $content = null ) {
extract( shortcode_atts( array(
'type' => '',
), $atts ) );
$thefiles = showFiles('files/'.$type.'files/'.do_shortcode($content));
return $thefiles;
}
add_shortcode('showfiles', 'sc_showfiles');
Upvotes: 2
Views: 3723
Reputation: 5973
Returning something from a function won't echo it out to the page. When you call your function you could try echo showFile(blah);
If you are returning php, then remember php is server side. Are you returning this to the client? If so then it wont work and you should reinvestigate this. The client won't run PHP.
Why don't you use ajax or something?
EDIT:
print showFiles('files/'.$type.'files/'.do_shortcode($content));
Now in your showFiles function, put <ul>
around the return string. That should make things less confusing.
EDIT-EDIT:
function showFiles($path){
if ($handle = opendir($path))
{
$up = substr($path, 0, (strrpos(dirname($path."/."),"/")));
$returnString = "<ul>"; //ADDED THIS
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..")
{
$fName = $file;
$file = $path.'/'.$file;
if(is_file($file)) {
returnString .= "<li><a href='/".$file."' target=_blank>".$fName."</a></li>";
}
}
}
closedir($handle);
$returnString .= "</ul>";
return $returnString;
}
}
Upvotes: 1