/** * 構造化データ (Schema.org) ビルダーヘルパー * * 動画データから VideoObject の連想配列を組み立てる共通処理。 * チャンネルトップ (channel-popular-list / channel-latest-list) と * 一覧ページ (channel-popular-videos / channel-videos) の両方で同一仕様を使う。 */ if ( ! function_exists( 'build_schema_video_object' ) ) { /** * 動画データ配列から Schema.org VideoObject 形式の連想配列を生成する。 * * @param array $video get_video_data() / get_channel_cache_data() で取得した動画データ * @param string $channel_id 親チャンネル ID (URL 組み立て用) * * @return array|null video_id が空なら null */ function build_schema_video_object( $video, $channel_id ) { if ( empty( $video['video_id'] ) ) { return null; } $desc_parts = array(); $desc_parts[] = '再生回数' . number_format( $video['video_view'] ) . '回'; $desc_parts[] = 'いいね' . number_format( $video['video_like'] ) . '件'; $desc_parts[] = 'コメント' . number_format( $video['video_comment'] ) . '件'; if ( ! empty( $video['video_published_at'] ) ) { $desc_parts[] = '投稿日' . date( 'Y/m/d', $video['video_published_at'] ); } // Duration: 6-digit HHMMSS → ISO 8601 $iso_duration = ''; if ( ! empty( $video['video_duration'] ) ) { $dur = sprintf( '%06d', $video['video_duration'] ); $h = (int) substr( $dur, 0, 2 ); $m = (int) substr( $dur, 2, 2 ); $s = (int) substr( $dur, 4, 2 ); $iso_duration = 'PT'; if ( $h > 0 ) { $iso_duration .= $h . 'H'; } if ( $m > 0 ) { $iso_duration .= $m . 'M'; } $iso_duration .= $s . 'S'; } $item_data = array( '@type' => 'VideoObject', 'name' => $video['video_title'], 'url' => 'https://digitalcreators.jp/channel/' . $channel_id . '/videos/' . $video['video_id'] . '/', 'thumbnailUrl' => 'https://img.youtube.com/vi/' . $video['video_id'] . '/maxresdefault.jpg', 'embedUrl' => 'https://www.youtube.com/embed/' . $video['video_id'], 'description' => implode( '、', $desc_parts ), 'interactionStatistic' => array( array( '@type' => 'InteractionCounter', 'interactionType' => array( '@type' => 'WatchAction' ), 'userInteractionCount' => (int) $video['video_view'], ), array( '@type' => 'InteractionCounter', 'interactionType' => array( '@type' => 'LikeAction' ), 'userInteractionCount' => (int) $video['video_like'], ), array( '@type' => 'InteractionCounter', 'interactionType' => array( '@type' => 'CommentAction' ), 'userInteractionCount' => (int) $video['video_comment'], ), ), ); if ( ! empty( $iso_duration ) ) { $item_data['duration'] = $iso_duration; } if ( ! empty( $video['video_published_at'] ) ) { $item_data['uploadDate'] = date( "Y-m-d\TH:i:s+09:00", (int) $video['video_published_at'] ); } return $item_data; } } if ( ! function_exists( 'build_channel_additional_properties' ) ) { /** * チャンネルの統計値を Schema.org additionalProperty (PropertyValue の配列) として生成する。 * チャンネルランキング(カルーセルの各ListItem)とチャンネルページ(ProfilePage の mainEntity)で共用。 * * @param array $c チャンネルデータ連想配列。channel_ranking.JP の行 / get_channel_data() の結果。 * 必要列: channel_difference_user, channel_difference_view, channel_video_view, * channel_user, channel_newest_avg_view_count, channel_newest_avg_good, * channel_newest_avg_comment, channel_newest_per_engagement。 * * @return array PropertyValue 連想配列のリスト(該当データが無い項目はスキップ)。 */ function build_channel_additional_properties( $c ) { // label => array( 列名, 値の型 )。値は表示中の項目に対応。 $map = array( '30-Day Subscriber Growth' => array( 'channel_difference_user', 'int' ), '30-Day View Count Growth' => array( 'channel_difference_view', 'int' ), 'Lifetime Channel Views' => array( 'channel_video_view', 'int' ), 'Total Channel Subscribers' => array( 'channel_user', 'int' ), 'Average Views Per Video' => array( 'channel_newest_avg_view_count', 'round' ), 'Average Likes Per Video' => array( 'channel_newest_avg_good', 'round' ), 'Average Comments Per Video' => array( 'channel_newest_avg_comment', 'round' ), 'Channel Engagement Rate' => array( 'channel_newest_per_engagement', 'rate' ), ); $props = array(); foreach ( $map as $label => $def ) { list( $col, $type ) = $def; if ( ! isset( $c[ $col ] ) || $c[ $col ] === '' || $c[ $col ] === null ) { continue; } $raw = $c[ $col ]; if ( $type === 'rate' ) { // engagement率: 保存値は比率(0.0615)なので %(6.15) に変換し unitText を付与。 $props[] = array( '@type' => 'PropertyValue', 'name' => $label, 'value' => round( (float) $raw * 100, 2 ), 'unitText' => 'PERCENT', ); continue; } $value = ( $type === 'round' ) ? (int) round( (float) $raw ) : (int) $raw; $props[] = array( '@type' => 'PropertyValue', 'name' => $label, 'value' => $value, ); } return $props; } } JO1 | YouTuberトレンド分析メディア:デジタルクリエイターズ
月間音楽動画再生回数ランキングを発表! &TEAM、ライブパフォーマンス動画公開で1800万再生超!HANA新曲「NON STOP」MV公開! SixTONES、ジュニア時代の楽曲「Amazing!!!!!!」MV公開‼
カテゴリ別人気動画人気動画

月間音楽動画再生回数ランキングを発表! &TEAM、ライブパフォーマンス動画公開で1800万再生超!HANA新曲「NON STOP」MV公開! SixTONES、ジュニア時代の楽曲「Amazing!!!!!!」MV公開‼

週間音楽再生回数ランキングを発表!西野カナ「THE FIRST TAKE」初登場で「会いたくて 会いたくて」披露‼Snow Man、「SERIOUS」のDance Practice公開!TOBE所属の新グループ「CLASS SEVEN」配信デビュー‼
カテゴリ別人気動画人気動画

週間音楽再生回数ランキングを発表!西野カナ「THE FIRST TAKE」初登場で「会いたくて 会いたくて」披露‼Snow Man、「SERIOUS」のDance Practice公開!TOBE所属の新グループ「CLASS SEVEN」配信デビュー‼

月間音楽再生回数ランキングを発表!メダリストOP主題歌、羽生結弦出演!米津玄師新曲MVで最高難易度4回転ルッツ成功に「鳥肌立った」。ME:I、3rdシングル「MUSE」MV公開!憧れる側から、希望を与える存在へ!XG、「IS THIS LOVE」MV公開!
カテゴリ別人気動画人気動画

月間音楽再生回数ランキングを発表!メダリストOP主題歌、羽生結弦出演!米津玄師新曲MVで最高難易度4回転ルッツ成功に「鳥肌立った」。ME:I、3rdシングル「MUSE」MV公開!憧れる側から、希望を与える存在へ!XG、「IS THIS LOVE」MV公開!

月間総合再生回数ランキングを発表!メダリストOP主題歌、羽生結弦出演!米津玄師新曲MVで最高難易度4回転ルッツ成功に「鳥肌立った」。人気アニメ「俺だけレベルアップな件」の最終話PV公開!
カテゴリ別人気動画人気動画

月間総合再生回数ランキングを発表!メダリストOP主題歌、羽生結弦出演!米津玄師新曲MVで最高難易度4回転ルッツ成功に「鳥肌立った」。人気アニメ「俺だけレベルアップな件」の最終話PV公開!

週間動画再生数ランキング音楽部門を発表!1位は『JO1』!4月2日リリースのベストアルバムの表題曲MVがランクイン!2位には『乃木坂46 OFFICIAL CHANNEL』の新曲「ネーブルオレンジ」!「井上和」と「中西アルノ」がWセンターを務める!3位には『京本大我 from ART-PUT』のソロ楽曲「滑稽なFight」!4月23日リリース予定のアルバムに期待が高まる!
人気動画

週間動画再生数ランキング音楽部門を発表!1位は『JO1』!4月2日リリースのベストアルバムの表題曲MVがランクイン!2位には『乃木坂46 OFFICIAL CHANNEL』の新曲「ネーブルオレンジ」!「井上和」と「中西アルノ」がWセンターを務める!3位には『京本大我 from ART-PUT』のソロ楽曲「滑稽なFight」!4月23日リリース予定のアルバムに期待が高まる!

週間動画再生数総合ランキングを発表!1位は人気アニメ「俺だけレベルアップな件」の最終話PV!2位には『JO1』がランクイン!ベートーベンの「運命」をサンプリングした新曲MVに注目!3位『Nintendo 公式チャンネル』!「たまごっち」や「トモコレ」などの続編が発表!!
人気動画

週間動画再生数総合ランキングを発表!1位は人気アニメ「俺だけレベルアップな件」の最終話PV!2位には『JO1』がランクイン!ベートーベンの「運命」をサンプリングした新曲MVに注目!3位『Nintendo 公式チャンネル』!「たまごっち」や「トモコレ」などの続編が発表!!

Snow Man、『ブルーロック VS. U-20 JAPAN』エンディング曲「One」MV公開(『RAYS』収録曲)!INI、7枚目シングル「THE VIEW」のタイトル曲「WMDA(Where My Drums At)」MV公開!Nissy、パク・ミニョンとのラブストーリー動画公開!【週間音楽ランキング】
カテゴリ別人気動画トレンドニュース人気動画

Snow Man、『ブルーロック VS. U-20 JAPAN』エンディング曲「One」MV公開(『RAYS』収録曲)!INI、7枚目シングル「THE VIEW」のタイトル曲「WMDA(Where My Drums At)」MV公開!Nissy、パク・ミニョンとのラブストーリー動画公開!【週間音楽ランキング】

JO1、ハワイで撮影した「WHERE DO WE GO」のMVが1位に!YOASOBI、アニメ主題歌のMV公開!不破湊、大変なホストの日々を歌った楽曲が人気!【月間音楽ランキング】
人気動画

JO1、ハワイで撮影した「WHERE DO WE GO」のMVが1位に!YOASOBI、アニメ主題歌のMV公開!不破湊、大変なホストの日々を歌った楽曲が人気!【月間音楽ランキング】

JO1、ハワイで撮影した「WHERE DO WE GO」のMVが1位に!YOASOBI、アニメ主題歌のMV公開!よにのちゃんねる、復活動画がランクイン!【月間総合人気動画】
カテゴリ別人気動画人気動画

JO1、ハワイで撮影した「WHERE DO WE GO」のMVが1位に!YOASOBI、アニメ主題歌のMV公開!よにのちゃんねる、復活動画がランクイン!【月間総合人気動画】

JO1、新曲のMV公開で1週間で500万回再生突破!よにのちゃんねるは謹慎中の中丸について”次ダメなら引退”と厳しく語り2位にランクイン!【週間総合ランキング】

JO1、新曲のMV公開で1週間で500万回再生突破!よにのちゃんねるは謹慎中の中丸について”次ダメなら引退”と厳しく語り2位にランクイン!【週間総合ランキング】

大人気ボカロPサツキの新曲「メズマライザー」、5300万回再生超えで断トツ首位!SnowMan、ラウール主演映画『赤羽骨子のボディーガード』主題歌「BREAKOUT」MV公開!【3ヶ月音楽ランキング】
人気動画

大人気ボカロPサツキの新曲「メズマライザー」、5300万回再生超えで断トツ首位!SnowMan、ラウール主演映画『赤羽骨子のボディーガード』主題歌「BREAKOUT」MV公開!【3ヶ月音楽ランキング】

ボカロPサツキ、メズマライザーが5000万再生越え!Snow Man、ラウール主演映画主題歌が人気!米津玄師、連ドラ主題歌に注目!XG、ミセスも!【3ヶ月総合ランキング】
カテゴリ別人気動画人気動画

ボカロPサツキ、メズマライザーが5000万再生越え!Snow Man、ラウール主演映画主題歌が人気!米津玄師、連ドラ主題歌に注目!XG、ミセスも!【3ヶ月総合ランキング】

Number_i新曲「BON」、公開5日で2200万再生超え!JO1、LOVEに溢れたシングルリード曲MVが2位!【月間音楽人気動画】
人気動画

Number_i新曲「BON」、公開5日で2200万再生超え!JO1、LOVEに溢れたシングルリード曲MVが2位!【月間音楽人気動画】

Number_i、平野紫耀プロデュース新曲MV1位!ヒカキン、マッシュルOP再現のクオリティの高さを絶賛する声殺到!【月間総合人気動画】
人気動画

Number_i、平野紫耀プロデュース新曲MV1位!ヒカキン、マッシュルOP再現のクオリティの高さを絶賛する声殺到!【月間総合人気動画】

Number_i,最新アルバムリード曲「BON」のMVが再生回数2000万超え突破!同事務所IMPの新曲や米津玄師の新CM曲もランクイン!【週間音楽人気動画】
人気動画

Number_i,最新アルバムリード曲「BON」のMVが再生回数2000万超え突破!同事務所IMPの新曲や米津玄師の新CM曲もランクイン!【週間音楽人気動画】

JO1のトレンドニュース