0

ワードプレスのカスタムフィールドキーを一覧表示するphpimplode関数があります。問題は、Web URLをhrefでラップしてクリック可能にする必要があり、関数sytnaxに頭をラップできないことです。キー値はwww.site.comの形式であるため、次のように単一のエントリ用に設定しました。

<?php if(get_post_meta($post->ID, 'website', true)): ?>
    <strong>Website:</strong> <a href="http://<?php echo get_post_meta($post->ID, 'website', true); ?>" target="_blank"><?php echo get_post_meta($post->ID, 'website', true); ?></a>
<?php endif; ?>

ただし、コンマで区切られた複数のエントリを保持できる必要があります。動作するコードは次のとおりですが、クリック可能なURLは出力されません。

<?php
if( $website = get_post_meta($post->ID, 'website') ):
    $label = count( $website ) > 1 ? 'Websites' : 'Website';
    ?>
    <strong><?php echo $label; ?>:</strong> <?php echo implode( $website, ', ' ); ?><br />
    <?php
endif;
?>

これは私が遊んでいるものですが、明らかに間違っています

<?php echo '<a href="http://' . implode('" target="_blank">', $website) . "</a>" . ', '; ?><br />

それ機能したとしても、リンクされているテキストではなく、URLのみを出力します。

- - - - - - - - - - - 編集 - - - - - - - - - - - - -

甲斐の答えが一番近いので、答えをマークしましたが、ラベル変数は含まれていませんでした。それらの2つを結婚することによって私は美しく働くこの答えを思いついた

<?php
    if( $website = get_post_meta($post->ID, 'website') ):
        $label = count( $website ) > 1 ? 'Websites' : 'Website';
        $links = array_map(
            function($url) {
                 $url = htmlspecialchars($url);
                 return sprintf ('<a href="http://%s">%s</a>', $url, $url);
            },
            $website);
        ?>
        <strong><?php echo $label; ?>:</strong> <?php echo implode(', ', $links); ?><br />
<?php endif ?>
4

3 に答える 3

1
<?php
if( $website = get_post_meta($post->ID, 'website') ):
    $label = count( $website ) > 1 ? 'Websites' : 'Website';
    ?>
    <strong><?php echo $label; ?>:</strong> 
    <?php foreach($website AS $w): ?>
        <a href="<?php echo $w; ?>" target="_blank"><?php echo $w; ?></a> <br />
    <?php endforeach; ?>      
<?php endif; ?>

これにより、配列内のすべての「Webサイト」がhttp://を含む完全に有効なURLであると想定されます。

ここでの問題の根本は、 implodeが何をするのか、そしてなぜそれがあなたが望むように機能しないのかを理解することだと思います。

編集:

ほら、あなたはそれらをコンマで区切られたインラインリストに入れたいのです。Jonの方法を使用する必要があります。これは、ここで提案した方法よりもエレガントに必要なことを実行するためです。

于 2012-10-12T23:57:27.877 に答える
0

implode自分で試したのと同じように真剣に悪用して機能させることもできますが、それは実際には良い考えではありません。

必要なのは、URLのリストからアンカータグのリストに移動することです。これは次の方法で可能array_mapです。

if ($website = get_post_meta($post->ID, 'website')) {
    $links = array_map(
        function($url) {
             $url = htmlspecialchars($url);
             return sprintf ('<a href="http://%s">%s</a>', $url, $url);
        },
        $website);

    echo implode(', ', $links);
}
于 2012-10-12T23:56:50.540 に答える
0

デコレータパターンを使用する必要があります。ニーズに合わせて以下の例を変更してください

interface HtmlElementInterface {
    public function getText();
    public function render();
}

class LinkDecorator implements HtmlElementInterface {

    protected $title;
    protected $text;

    public function __construct($text, $title, $renderNow = false) {
        if (!is_string($text) || empty($text)) {
            throw new InvalidArgumentException("The text of the element must be a non-empty string.");
        }
        $this->text = $text;
        $this->title = $title;
        if ($renderNow) {
            echo $this->render();
        }
    }

    public function getText() {
        return $this->text;
    }

    public function render() {
        // do your magic here
        return "<a href='" . $this->text . "'>" . $this->title . "</a>";
    }

}
于 2012-10-13T03:44:18.827 に答える