Как ограничить содержание шорткодов WordPress? - PullRequest
0 голосов
/ 01 апреля 2019

Я работаю над шорткодами WordPress, в которых я хочу ограничить содержимое, полученное из xml .

Код, который я использовал для создания шорткода WordPress:

function podcast_func( $content = null ){
    ob_start();
    ?>
<script src="https://content.jwplatform.com/libraries/FZ8yNTef.js"></script>
<center><div id="podcast" align="center"></div></center> 
<script> 
var PodcastplayerInstance = jwplayer("podcast"); 
PodcastplayerInstance.setup({ 
  playlist: "http://www.cpac.ca/tip-podcast/jwplayer.xml", 
  androidhls: true, 
  preload: "auto", 
  height: 200, 
  width: 400,
  visualplaylist:false,
  stretching: "fill",
    "plugins": {
        "http://www.cpac.ca/tip-podcast/listy.js":{},
        'viral-2': {'oncomplete':'False','onpause':'False','functions':'All'}
    }
});
</script> 
<?PHP
    return ob_get_clean();
}
add_shortcode( 'podcast', 'podcast_func' );


При использовании этого: <div class="today-podcast" style="text-align: center;">[podcast]</div>, он отображает весь контент отсюда http://www.cpac.ca/tip-podcast/jwplayer.xml

Постановка проблемы: Мне интересно, какие изменения я должен внести в шорткод WordPress выше, чтобы он отображал только первые два элемента или любой отдельный элемент отсюда http://www.cpac.ca/tip-podcast/jwplayer.xml

enter image description here

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Сначала вам нужно будет проанализировать XML и сгенерировать массив нужных вам медиа-объектов, а не получить прямой доступ к RSS-каналу.

Во-первых, вы можете использовать PHP-функцию xpath , чтобы написать запрос xpath и извлечь поля, которые вы ищете. Это позволяет вам выбирать и извлекать поля из файла XML. Получение этого XML-запроса может выглядеть следующим образом:

    $context  = stream_context_create(array('http' => array('header' => 'Accept: application/xml')));
    $url = 'http://www.cpac.ca/tip-podcast/jwplayer.xml';

    $xml = file_get_contents($url, false, $context);
    $xml = simplexml_load_string($xml);
    $itemarray = $xml->xpath("/rss/channel/item[1]");

Так что мы здесь делаем? Мы создаем массив, содержащий только первый элемент в файле XML. Этот массив будет выглядеть примерно так:

    Array
    (
    [0] => Item
         (
         [title] => April 3, 2019
         [description] => Jody Wilson-Raybould...
         [jwplayer:image] => {image URL}
         [jwlplayer:source] => SimpleXMLElement Object
         )
    )

На этом этапе вы можете разобрать массив в медиа-объекты для вставки в вашу конструкцию следующим образом:

$playlist[] = [
     "file" => $itemarray[0][jwplayer:source]->['file'],
     "image" => $itemarray[0][jwplayer:image],
     "description" => $itemarray[0][description],
     "title" => $itemarray[0][title]
     ];

Как только это будет сделано, вы можете передать свой массив медиа-объектов в API как обычно:

    PodcastplayerInstance.setup({ 
      playlist: <?php echo json_encode($playlist); ?>, 
      androidhls: true, 

И это должно вернуть только те элементы, которые вы желаете. Если вы хотите сделать еще один шаг вперед, ознакомьтесь с этим руководством по шорткоду , чтобы узнать, как вы можете настроить его так, чтобы пользователь WordPress пропускал количество объектов, которые он хотел бы видеть! (Я оставлю выяснение, как настроить циклическое поведение на ваше усмотрение, но я думаю, что это довольно очевидно.)

PHP Pros, пожалуйста, прости мои грехи, я очень новичок в этом. Поправки к методологии и синтаксису приветствуются и приветствуются в комментариях.

1 голос
/ 05 апреля 2019

Лучше сначала сохранить возвращенный XML-файл в файл, а затем вернуться к ноль.

<?php
  $curl = curl_init();

  curl_setopt_array($curl, array(
    CURLOPT_URL => "http://www.cpac.ca/tip-podcast/jwplayer.xml",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => array(
      "cache-control: no-cache",
      "postman-token: 28025ee8-1e82-ce60-f6ae-f401118baa1c"
    ),
  ));

  $response = curl_exec($curl);
  $err = curl_error($curl);

  curl_close($curl);

  if ($err) {
    echo "cURL Error #:" . $err;
  } else {
    $fp = fopen(ABSPATH.'jwp.xml', 'w');
    fwrite($fp, $response);
    fclose($fp);
  }

  $xml = simplexml_load_file(ABSPATH.'jwp.xml');

  for($i = count($xml->channel->item); $i >= 2; $i--){
    unset($xml->channel->item[$i]);
  }

  $xml->saveXML(ABSPATH.'jwp.xml');

  ?>
  <script src="https://content.jwplatform.com/libraries/FZ8yNTef.js"></script>
  <center><div id="podcast" align="center"></div></center> 
  <script> 
  var PodcastplayerInstance = jwplayer("podcast"); 
  PodcastplayerInstance.setup({ 
    playlist: "<?php echo site_url(); ?>/jwp.xml", 
    androidhls: true, 
    preload: "auto", 
    height: 200, 
    width: 400,
    visualplaylist:false,
    stretching: "fill",
      "plugins": {
          "http://www.cpac.ca/tip-podcast/listy.js":{},
          'viral-2': {'oncomplete':'False','onpause':'False','functions':'All'}
      }
  });
  </script> 

Если вам нужен только 2-й или 3-й элемент, обновите приведенный выше код следующим

for($i = count($xml->channel->item); $i >= 3; $i--){
  unset($xml->channel->item[$i]);
}

for($i = 0; $i < count($xml->channel->item); $i++){
  unset($xml->channel->item[0]);
}
...