プラグインなしでnoteの画像付き記事カードを表示させるスニペット

noteのアイキャッチイラスト

最近noteで書かれた記事を見かける機会が増えていませんか?

かくいう自分もよく利用しています。

noteはブログと同じで情報発信ができるサービスですが「有料販売できる」「文章を書くことに特化」など独自の特徴があり、自分でシステムを構築するよりも、noteで書いた方が人目につきやすく、より拡散されやすい事も多くあると思います。

今回は、プラグインなしでnoteの画像付き記事カードをwordpressに表示させるスニペットについてご紹介します。

noteのカード型サムネイルサンプル

RSSから20個の記事を取得して出力させたカード型のサンプルです。

クリックしてその記事にも遷移でき、本文を80文字抜粋して表示しています。

最近気になった記事まとめ(1) eyecatch

note

どうも、あしたのチーム デザイン事業部 部長 鈴木雄大です。毎日少なくとも1〜2時間くらいは、色々情報を取り入れることをクセにしている中で、まとめるところもなく...

PHPとCSSのコード

noteの場合はアイキャッチ画像を取得して表示して、wordpressの場合もこのPHPのコードで動き、本文1枚目の画像をサムネイルとして取得して表示します。

CSSはSANGOのテーマに合わせて作ったので、お使いのテーマに合わせて調整しお使いください。

コードを表示する

PHP

<?php
include_once(ABSPATH . WPINC . '/feed.php');
$rss_arr = array('RSSのURLその1', 'RSSのURLその2');
$rss = fetch_feed($rss_arr);if (!is_wp_error( $rss ) ) :
// すべてのフィードから最新20件を出力します。
//全部表示する場合は -1
$maxitems = $rss->get_item_quantity(20);
$rss->set_cache_duration(1800);
$rss_items = $rss->get_items(0, $maxitems); endif;?>
<div class="notecardtype cf">
<!--// 取得できた RSS フィードが0件の時は「No items.」と表示します。-->
<?php if ($maxitems == 0) echo '<li>No items.</li>';
else
foreach ( $rss_items as $item ) : ?>
<article class="notecardtype__article">
<a class="notecardtype__link" href='<?php echo $item->get_permalink(); ?>' target="_blank">
<p class="notecardtype__img">
<?php if(has_post_thumbnail()): ?>
<!--//サムネイルがなければ規定の画像を表示します-->
<?php
    $hash = substr($item->get_link(), strrpos($item->get_link(), '/') + 1);
    $api_data = file_get_contents('https://note.mu/api/v1/' . 'notes/' . $hash);
    $eyecatch = json_decode($api_data, true)['data']['eyecatch'];
?>
<?php
    $first_img = '';
    if (preg_match('/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi',$item->get_content(), $matches )) { $first_img = $matches[1]; }
?>
<?php
    if (!empty($eyecatch)){
       echo '<img src="'.$eyecatch.'" alt="'.$item->get_title().' eyecatch" width="640" height="auto">';
    };
?>
<?php
    if (!empty($first_img)){
       echo '<p class="thumb"><img src="'.esc_attr($first_img).'"  alt="'.$item->get_title().' first_img" /></p>';
}; ?>
<?php
    if(empty($eyecatch) && empty($first_img)){
        echo '<img src="../default.jpg" >';
    };
?>
<?php endif; ?>
</p>
<div class="notecardtype__article-info">
<time class="notepubdate entry-time dfont" itemprop="datePublished" datetime="<?php echo $item->get_date('Y.m.d');// 日付 ?>"><?php echo $item->get_date('Y.m.d');// 日付 ?></time>
<p class="notecardtitle"><?php echo $item->get_title(); ?></p>
</div>
</a>
  <a class="dfont notecat-name catid60"><img src="https://dubdesign.net/wp-content/uploads/2020/11/note_logo.png" alt="note"></a>
<p class="notedescription"><?php echo mb_substr(strip_tags($item->get_description()), 0, 80);// 抜粋記事の文字数を指定 ?>...</p>
</article>
<?php endforeach; ?>
</div>

CSS

.notecardtype time {
    display: block;
    margin: 13px 13px 8px;
    color: #b5b5b5;
    font-size: 15px;
    font-weight: bold;
}

time.notepubdate:before {
    content: "\f017";
    padding-right: 5px;
    font-family: "Font Awesome 5 Free";
    font-weight: 900;
    opacity: 0.6;
}

.notecardtype__article {
    position: relative;
    width: 100%;
    margin: 0 0 25px;
    border-radius: 2px;
    background: #fff;
    box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.12), 0 2px 3px 0 rgba(0, 0, 0, 0.22);
    cursor: pointer;
    transition: 0.2s ease-in-out;
}

.notecardtype__article:hover {
    box-shadow: 0 15px 30px -5px rgba(0, 0, 0, 0.15), 0 0 5px rgba(0, 0, 0, 0.1);
    transform: translateY(-4px);
}

.notecardtype__link {
    display: block;
    color: #555;
    text-decoration: none;
    cursor: pointer;
}

.notecardtype__link:hover {
   text-decoration: none; 
}

.notecat-name {
    display: inline-block;
    overflow: hidden;
    position: absolute;
    top: 13px;
    left: 13px;
    height: 22px;
    margin: 0;
    padding: 0 10px;
    border-radius: 14px;
    color: #fff;
    font-size: 11px;
    font-weight: bold;
    vertical-align: middle;
    line-height: 22px;
}
.notecardtype__img {
    margin: 0;
    overflow: hidden;
    position: relative;
    height: 0;
    padding-bottom: 53%;
}

.notecardtype__img img {
    border-radius: 2px 2px 0 0;
    width: 100%;
}

.notecat-name {
    display: inline-block;
    overflow: hidden;
    position: absolute;
    top: 13px;
    left: 13px;
    height: 22px;
    margin: 0;
    padding: 2px 10px;
    border-radius: 14px;
    color: #fff;
    font-size: 11px;
    font-weight: bold;
    vertical-align: middle;
    line-height: 22px;
    background: #FFF;
    text-decoration: none;
}

.notecat-name img {
    height: 20px;
    padding: 1px 0 6px;
}

.entry-time.notepubdate {
    padding: 0 10px 0 0;
    margin-top: -1.0em;
}

.cf {
    zoom: 1;
}

p.notedescription {
    font-size: 0.7em;
    padding: 0px 15px;
    margin-top: -3.3em;
}

.notecardtitle {
    margin: 8px 13px 0;
    font-weight: bold;
    line-height:1.56;
    padding: 0 14px;
}

@media only screen and (min-width: 1030px){
.notecardtype__article {
    width: 48%;
    margin: 0 4% 25px 0;
}
.notecardtype__article:nth-child(even){
  margin-right:0;
}
.notecardtype__link {
    padding-bottom: 25px;
}
}

@media only screen and (min-width: 481px){
.notecardtype__article time {
    margin: 13px 13px 8px;
}

.notecardtype {
    display: -webkit-flex;
    display: -ms-flexbox;
    display: -moz-box;
    display: flex;
    flex-direction: row;
    -webkit-flex-direction: row;
    -webkit-flex-wrap: wrap;
    flex-wrap: wrap;
    margin-bottom:1em;
}
}
@media only screen and (max-width: 481px){
p.notedescription {
    font-size: 0.7em;
    padding: 0px 15px 20px;
    margin-top: -1.3em;
}
}