: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
<div class="item" data-vid="<?php echo $vid; ?>">
<div class="thumb" style="background: <?php echo "url({$thumbnail}) no-repeat center"; ?>">
<img src="<?php echo esc_url(EMBEDPRESS_URL_ASSETS . 'images/youtube/youtube-play.png'); ?>" alt="">
<p><?php echo $item->snippet->title; ?></p>
<div class="item" style="height: 0"></div>
<?php if ($totalPages > 1) : ?>
<div class="ep-youtube__content__pagination <?php echo (empty($prevPageToken) && empty($nextPageToken)) ? ' hide ' : ''; ?>">
class="ep-prev" <?php echo empty($prevPageToken) ? ' style="display:none" ' : ''; ?>
data-playlistid="<?php echo esc_attr($options['playlistId']) ?>"
data-pagetoken="<?php echo esc_attr($prevPageToken) ?>"
data-pagesize="<?php echo intval($options['pagesize']) ?>"
<span><?php _e("Prev", "embedpress"); ?></span>
<div class="is_desktop_device ep-page-numbers <?php echo $totalPages > 1 ? '' : 'hide'; ?>">
$numOfPages = $totalPages;
$renderedEllipses = false;
$currentPage = !empty($options['currentpage'])?$options['currentpage'] : 1;
for($i = 1; $i<=$numOfPages; $i++)
$is_current = $i == (int)$currentPage? "active__current_page" : "";
echo wp_kses_post("<span class='page-number $is_current' data-page='$i'>$i</span>");
//render current page number
else if($i == (int)$currentPage) {
echo wp_kses_post('<span class="page-number active__current_page" data-page="'.$i.'">'.$i.'</span>');
$renderedEllipses = false;
else if ($i >= $numOfPages - 1) {
echo wp_kses_post('<span class="page-number" data-page="'.$i.'">'.$i.'</span>');
//make sure you only do this once per ellipses group
$renderedEllipses = true;
<div class="is_mobile_device ep-page-numbers <?php echo $totalPages > 1 ? '' : 'hide'; ?>">
$numOfPages = $totalPages;
$renderedEllipses = false;
$currentPage = !empty($options['currentpage'])?$options['currentpage'] : 1;
for($i = 1; $i<=$numOfPages; $i++)
//render current page number
if($i == (int)$currentPage) {
echo wp_kses_post('<span class="page-number-mobile" data-page="'.$i.'">'.$i.'</span>');
$renderedEllipses = false;
else if ($i >= $numOfPages ) {
echo wp_kses_post('...<span class="page-number-mobile" data-page="'.$i.'">'.$i.'</span>');
class="ep-next " <?php echo empty($nextPageToken) ? ' style="display:none" ' : ''; ?>
data-playlistid="<?php echo esc_attr($options['playlistId']) ?>"
data-pagetoken="<?php echo esc_attr($nextPageToken) ?>"
data-pagesize="<?php echo intval($options['pagesize']) ?>"
<span><?php _e("Next ", "embedpress"); ?> </span>
<div class="ep-loader-wrap">
<div class="ep-loader"><img alt="loading" src="<?php echo esc_url(EMBEDPRESS_URL_ASSETS . 'images/youtube/spin.gif'); ?>"></div>
$gallobj->html = ob_get_clean();
$gallobj->html = self::clean_api_error_html(__("There is nothing on the playlist.", 'embedpress'));
public static function get_api_key_error_message(){
return '<div>' . sprintf(__("EmbedPress: Please enter your YouTube API key at <a class='ep-link' href='%s' target='_blank' style='color: #5b4e96; text-decoration: none'>EmbedPress > Platforms > YouTube</a> to embed YouTube Channel.", "embedpress"), admin_url('?page=embedpress&page_type=youtube#api_key')) . '</div>';
public static function get_id($item){
$vid = isset($item->snippet->resourceId->videoId) ? $item->snippet->resourceId->videoId : null;
$vid = $vid ? $vid : (isset($item->id->videoId) ? $item->id->videoId : null);
$vid = $vid ? $vid : (isset($item->id) ? $item->id : null);
public static function get_thumbnail_url($item, $quality, $privacyStatus) {
if ($privacyStatus == 'private') {
$url = EMBEDPRESS_URL_ASSETS . 'images/youtube/private.png';
} elseif (isset($item->snippet->thumbnails->{$quality}->url)) {
$url = $item->snippet->thumbnails->{$quality}->url;
} elseif (isset($item->snippet->thumbnails->medium->url)) {
$url = $item->snippet->thumbnails->medium->url;
} elseif (isset($item->snippet->thumbnails->default->url)) {
$url = $item->snippet->thumbnails->default->url;
} elseif (isset($item->snippet->thumbnails->high->url)) {
$url = $item->snippet->thumbnails->high->url;
$url = EMBEDPRESS_URL_ASSETS . 'images/youtube/deleted-video-thumb.png';
public static function compare_vid_date($a, $b) {
if ($a->snippet->publishedAt == $b->snippet->publishedAt) {
return ($a->snippet->publishedAt > $b->snippet->publishedAt) ? -1 : 1;
public static function clean_api_error($raw_message) {
return htmlspecialchars(strip_tags(preg_replace('@&key=[^& ]+@i', '&key=*******', $raw_message)));
public static function clean_api_error_html($raw_message) {
if ((defined('REST_REQUEST') && REST_REQUEST) || current_user_can('manage_options')) {
$clean_html = '<div>' . __('EmbedPress: ', 'embedpress') . self::clean_api_error($raw_message) . '</div>';
/** inline {@inheritdoc} */
public function getFakeResponse() {
preg_match('~v=([a-z0-9_\-]+)~i', (string) $this->url, $matches);
$embedUrl = 'https://www.youtube.com/embed/' . $matches['1'] . '?feature=oembed';
$attr[] = 'width="{width}"';
$attr[] = 'height="{height}"';
$attr[] = 'src="' . esc_url($embedUrl) . '"';
$attr[] = 'frameborder="0"';
$attr[] = 'allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"';
$attr[] = 'allowfullscreen';
'provider_name' => 'Youtube',
'provider_url' => 'https://www.youtube.com',
'title' => 'Unknown title',
'html' => '<iframe ' . implode(' ', $attr) . '></iframe>',
// public static $num = 0;
public static function styles($params, $url){
$uniqid = '.ose-youtube.ose-uid-'.md5($url);
.ep-youtube__content__pagination {
.ep-youtube__content__pagination .ep-prev,
.ep-youtube__content__pagination .ep-next {
border: 1px solid rgba(0, 0, 0, .1);
.ep-youtube__content__pagination .ep-prev:hover,
.ep-youtube__content__pagination .ep-next:hover{
background-color: #5B4E96;
.ep-youtube__content__pagination .ep-page-numbers {
.ep-youtube__content__pagination .ep-page-numbers > span {
border: 1px solid rgba(0, 0, 0, .1);
.ep-youtube__content__block .youtube__content__body .content__wrap {
grid-template-columns:repeat(auto-fit, minmax(250px, 1fr));
.ep-youtube__content__block .item {
.ep-youtube__content__block .item:hover .thumb .play-icon {
.ep-youtube__content__block .item:hover .thumb:after {
.ep-youtube__content__block .thumb {
background-size: contain !important;
.ep-youtube__content__block .thumb:after {
transition: opacity .3s ease;
.ep-youtube__content__block .thumb:before {
.ep-youtube__content__block .thumb img {
.ep-youtube__content__block .thumb .play-icon {
transform: translate(-50%, -50%);
transition: all .3s ease;
.ep-youtube__content__block .thumb .play-icon img {
.ep-youtube__content__block .body p {
.ep-youtube__content__block.loading .ep-youtube__content__pagination {
.ep-youtube__content__block .ep-loader {
.ep-youtube__content__block.loading .ep-loader {
.is_mobile_devic.ep-page-numbers {
@media only screen and (max-width: 480px) {
.ep-youtube__content__pagination .ep-page-numbers > span {
.ep-youtube__content__pagination .ep-prev, .ep-youtube__content__pagination .ep-next{
display: flex!important;;
.ep-youtube__content__pagination .ep-page-numbers {
$attributes_data = $params;
if (isset($attributes_data['ispagination']) && $attributes_data['ispagination']) {
if(isset($attributes_data['gapbetweenvideos'])){
$gap = $attributes_data['gapbetweenvideos'];
if(isset($attributes_data['columns'])){
$columns = $attributes_data['columns'];
if(!empty($columns) && (int) $columns > 0){
$repeatCol = 'repeat(auto-fit, minmax('.esc_html('calc('.(100 / (int) $columns).'% - '.$gap.'px)').', 1fr))';
$repeatCol = 'repeat(auto-fit, minmax(calc(250px - '.$gap.'px), 1fr))';
<?php echo esc_attr($uniqid); ?> .ep-youtube__content__block .youtube__content__body .content__wrap {
gap: <?php echo esc_html($gap); ?>px !important;
margin-top: <?php echo esc_html($gap); ?>px !important;
grid-template-columns: <?php echo $repeatCol; ?>;
<?php echo esc_attr($uniqid); ?> .ep-youtube__content__block .ep-youtube__content__pagination {
display: <?php echo esc_html($is_pagination); ?>!important;
echo esc_attr($uniqid) ?> {