ショートコード —- 指定したURLのタイトルを表示してリンクを作る

2008/09/21 update!
前回、ご紹介したショートコードを発展させました。

前回はURLそのものが表示されてそこにリンクがついたのですが、今回は、そのURLのタイトルを表示してそのURLへのリンクを作るショートコードです。

指定したURLから、そのタイトルを抽出する”だけ”のプログラムを

のサイトを参考にさせていただきました。(^^;)ほぼそのまんまですが。。。

使い方は、

[link2]リンクしたいURL[/link2]

です。1つの記事の中で複数使う場合は、重複しないようにIDをつけます。名前はなんでもかまいません。

例えば、

[link2 id="lk1"]http://nakamura.tea-pot.jp[/link2]

という具合です。すると、URLの部分がそのURLのタイトルが表示されたリンクになります。

例として:

[link2 id="lk2"]http://nakamura.tea-pot.jp[/link2]

この実行結果:

中村家のほーむぺーじ

■重要--<p>対策!■
どうも、wordpress 付属のエディターは(お使いの方はおわかりのとおり、)ちょっとクセがあります。ソースを見ると勝手にタグを書き換えちゃったり改行してあったり。。
一番困ったのは、このショートコードの両端に、<p></p>をつけた場合、投稿するとこの<p></p>が削除されてしまうことです。
そこでこれを回避するために、
<p><p>[link2]URL[/link2]</p></p>
と、<p>タグを二重にしてみてください。

注意!!

上記のコードはコードが実行されないように全角で書いていますので

このままコピーペースとしても動きません(^^;)悪しからず。。。

このショートコードを動かすには下記のファンクションをテーマファイルのなかのfunction.phpに追加します。

<?php
add_shortcode('link2','link2_func');

function link2_func($atts, $content){

$url=$content;

ini_set( "display_errors", "Off");
$x=get_headers($url);
ini_set( "display_errors", "On");

$response = $x[0];
if (!preg_match('/200 OK/',$response)){
//存在しない
return '<span class="title2_err">--- "' . $content . '" URLが存在しません ---</span>' ;
}else{
//存在する
}

$file=fopen($url,"r");

if(!$file){
die("$urlをOPENできませんでした。アドレスが正しいかどうか見直してください。");
}//end if

$title="";
$tflg=0;

$from="UTF-8";
//$to="SHIFT-JIS";
$to="UTF-8";

while(!feof($file)){
$line=fgets($file,1024);
//<title>があるか?
$st=stristr($line,"<title>");
$ed=stristr($line,"</title>");
if($st && $ed ){//1行に<title>と</title>がある
$title=$line;
break;
}elseif($st){//<title>だけが見つかった
$title .= $line;
$tflg = 1;
}elseif($tflg != 0 && !$ed){//</title>が見つかるまで
$title .= $line;
}elseif($ed){//</title>が見つかったら
$title .= $line;
$tflg = 0;
break;
}//end if

}//end while

fclose($file);

$title =strip_tags($title);
//文字コード判別
$det_enc=mb_detect_encoding($title,"auto");
//タイトルを表示
if($det_enc and $det_enc != $to){
$title=mb_convert_encoding(strip_tags($title),$to,$det_enc);
return '<a href="' . $content . '">' . $title . '</a>';

}else{
$title=strip_tags($title);
return '<a href="' . $content . '">' . $title . '</a>';

}//end if

}//end function

?>

こんな感じです。

上の赤字のところを自分の環境にあわせて適宜変更したほうがいいのかな。。。??

wordpressはUTF8がデフォルトなのでこのままでいいですね。

おまけで、プラグインの形にもしてみました。

プラグインフォルダーの中に 解凍して出てきたPHPファイルをアップロードして、有効化するだけです。

08/09/21 不具合修正、バージョンアップしました title_link2_1.0.1

13 Responses

  • J君です。
    (ノ゜ο゜)ノ オオオオォォォォォォ-

    これ!早速持って帰りますね。
    :mrgreen:

    あれ?プレビューすると・・・
    うまく書けるかな?
    何かのテスト中?

  • あああ、J君、ちがいます
    わたしの説明不足ですが。
    ショートコードとこのプラグインは、投稿の時にしか動きません
    コメントでは動かないんです。朝からずっと作ってておおかたできたのですが、実際に動かそうとすると、動かないのです。
    comment_text()という関数に秘密があることはわかったんですが。。。

  • J君です。
    このプラグインは大活躍です。
    昔から、探していたのですが・・・どうしても見つからなかったのです。
    これ、WordPressの本家のプラグインに登録して、皆さんに使って欲しいくらいです。
    ホント、このプラグインは最高です!! :mrgreen:

  • nuttsさんへ

    今回のTitle Link2で少し質問があります。もしかすると、WordPressの仕様かも知れませんが・・・

    ケース1

    <p>[link2 id=links-1]http://jkun.sakura.ne.jp/[/link2]</p>

    と単に記述すると、前後の段落タグ<p>が消えてしまいます。なので、このプラグインを使う場合には、必ず

    ケース2

    <p>ここ[link2 id=links-1]http://jkun.sakura.ne.jp/[/link2]が参考になります</p>

    と言うように記述しています。つまり前後に文言を入れる。ケース1でも、<p>タグが削除されないようになれば、超嬉しいです。 WordPressの仕様なのかな??

  • おはようございます :grin:
    そんなにおほめいただいて、恥ずかしいです。 :oops:
    本家に登録ですか、そんなこと、、、、できるのかなあ、、、、
    あんまりノセナイデネ、その気になってしまいます :oops:

  • 毎日使う超嬉しいプラグインなので・・・
    もうひとつお願いがあります。

    リンク先URLが存在しなくなった場合

    Warning: fopen(http://jkun.sakura.ne.jp/articles/168d1/) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/jkun/www/wp-content/plugins/title_link2.php on line 21

    とエラーを吐くのですが、リンク先がない旨のメッセージが出るようになると、更に嬉しいです。ニュースサイト等は、すぐにリンクを切ってしまう場合がありますので・・・よろしくお願いします。もしかして・・・関数でエラーを吐いているのかな?そうなると難しいかも知れませんね。(×_×;)

  • J君、お返事が遅くなってすみません。
    コメント承認になっていなかったので表に出てこなくて、見逃していました。申し訳ありませんでした。
    ご指摘の点、早急に調べてみますね。 :shock:
    しばしお待ちを。。 :mrgreen:

  • が消える件ですが、ほんとうに消えちゃいますね(^^;)
    ソースは実に単純で、取得したタイトルにリンク付きのHTMLタグをくっつけて書き出しているだけなんですが。。。
    うみゅみゅー?

    エラーの件ですが、一応ソース的には簡単なエラー目セージ出して終了することになってるのですが、
    検証しておりませんでしたm(_ _;)m
    どうもそのエラー目セージを出して、exit();もしくわdie()するはずのところをスルーしちゃってサーバーがエラー出してますね。

    引き続き調査中。

  • エラーを吐く件ですが、頭に下記のようなコードを追加して、とりあえずエラーで落ちる件は回避できました。

     

    $url=$content;

    $x=get_headers($url);

    $response = $x[0];
    if (!preg_match(‘/Not Found/’,$response)){

    //存在する

    }else{

    //存在しない

    return ‘—"’ . $content . ‘": URLが存在しません—’ ;

    }

  • 不具合がありました。
    こちらのコードのほうがイイですね。

    $url=$content;

    $x=get_headers($url);

    $response = $x[0];
    if (!preg_match(‘/200 OK/’,$response)){

    //存在しない

    return ‘—"’ . $content . ‘": URLが存在しません—’ ;

    }else{

    //存在する

    }

  • J君一応できました。 :good:
    ただし、上の記事にも書いた通り、<p>の問題はどうもエディターのクセのようです。お手間がかかりますが<p></p>タグを二重にしてみてください。内側の1組が削除されて外側が残りますです :mrgreen:

    いっそ、ソースの中に書いてしまおうかとも思ったのですが、そうするといつでも両端で改行になってしまうのでそうしたくないときに困ります。
    苦肉の策ですね、すみません。

  • 色々(*’o’*)あ(*’ー’*)り(*’O’*)が(*’∇’*)と♪です。
    pタグの件は構いません。「」を前後にくっつけるようにしました。
    これで解決・・・ :mrgreen:

  • コメントが行き違いになりました、すみません。
    うにゃうにゃ、J君のコードの方がかっこいいですね!
    でもわたしにはちょっと難しいコードです。 :shock:
    もっと勉強します。 :mrgreen:

Leave a Reply