如何在自定义短代码中将URL作为参数读取外部页面的标题?

时间:2018-06-09 07:09:43

标签: wordpress wordpress-shortcode

我想在我的自定义短代码插件中显示作为参数给出的网页页面标题(例如:https://www.google.it/)。这是我的代码:

function shortcode_out($atts) {
    $atts = shortcode_atts( array(
        'link' => '/',
        'newtab' => false
    ) , $atts);


    if ($atts['newtab'] == true)
        return '<a target=_blank href='.$atts['link'].'>'.{GET_TITLE_OF_$atts['link']}.'</a>';
    else
        return '<a href='.$atts['link'].'>'.{GET_TITLE_OF_$atts['link']}.'</a>';
}

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:3)

外部网址

您必须抓住网页的内容,并从中获取标题。请注意这一点,因为它会显着降低页面的加载速度,具体取决于您尝试抓取的链接数量以及服务器传递内容所需的时间。

执行此操作还需要使用正则表达式解析HTML generally something to avoid

最终结果如下:

function shortcode_out($atts) {
    $atts = shortcode_atts( array(
        'link'   => '/',
        'newtab' => false
    ) , $atts);

    //get the URL title
    $contents = file_get_contents($atts['link']);
    if ( strlen($contents) > 0 ) {
        $contents = trim(preg_replace('/\s+/', ' ', $contents));
        preg_match("/\<title\>(.*)\<\/title\>/i", $contents, $title);
        $site_title = $title[1];
    } else {
        $site_title = 'URL could not be found';
    }


    if ($atts['newtab'] == true)
        return '<a target=_blank href='.$atts['link'].'>'.$site_title.'</a>';
    else
        return '<a href='.$atts['link'].'>'.$site_title.'</a>';
}

内部网址

如果你想获取一个内部网址,那么实际上有一个可以为你处理这个问题的WordPress功能:url_to_postid()。获得帖子ID后,您可以使用get_the_title()检索帖子标题,如下所示:

$post_id    = url_to_postid($url);
$title      = get_the_title($post_id);

这就是最终结果:

function shortcode_out($atts) {
    $atts = shortcode_atts( array(
        'link'   => '/',
        'newtab' => false
    ) , $atts);

    //get the post title
    $post_id    = url_to_postid($atts['link']);
    $title      = get_the_title($post_id);

    if ($atts['newtab'] == true)
        return '<a target=_blank href='.$atts['link'].'>'.$title.'</a>';
    else
        return '<a href='.$atts['link'].'>'.$title.'</a>';
}

url_to_postid如果无法解析该网址,则会返回int(0),因此如果您需要格外小心,可以随时更改$title变量以进行检查这样:

$title = ($post_id ? get_the_title($post_id) : 'Post could not be found');