2016-09-07 82 views
2

在我的wordpress網站上,我有許多基於不同人的動態頁面。我做了一個Ajax調用來獲取數據,生成所有包含在javascript函數中的數據的html,然後將其全部插入到實際頁面上的div中。有了這個,我想顯示最近三篇關於該頁面已加載的特定人員的文章。我發現結果告訴我這個增加的functions.php:將rss訂閱源異步放入動態頁面 - wordpress

//This file is needed to be able to use the wp_rss() function. 
include_once(ABSPATH.WPINC.'/rss.php'); 
function readRss($atts) { 
    extract(shortcode_atts(array(
    "feed" => 'http://', 
     "num" => '1', 
    ), $atts)); 

    return wp_rss($feed, $num); 
} 
add_shortcode('rss', 'readRss'); 

於是我試圖把這個在我的html:

var rsser = '<h2>In the News</h2>' + 
      '[rss feed="http://website.com/tag/' + tagname + '/feed/" num="3"]'; 
$('#rssCon').html(rsser); 

然而,這似乎並沒有奏效我擔心這可能是因爲它是異步發生的。在這種情況下,「標記名」將是我從Ajax調用中獲得的一段數據。

所以我正在尋找的是一種動態生成異步RSS源的方法。如果可能的話,如果有人能指出我的方向是好的,或者,如果不是,請告訴我!

添加更多的代碼:

var getNewsPerson = function() { 
    $.ajax({ 
     url:"http://website/api/v1/api?pid=" + personId, 
     type:"get", 
     success:function(res) { 
      return_tagname(res); 
      processPerson(res); 
     } 
    }); 
}; 

function processPerson(data) { 
    var returnedFeedShortcode = return_tagname(data); 
    var head = 
     '<div class="headForPerson-nt">' + 
      '<div class="hfpm-NextPerson-nt">' + 
       '<div class="hfpm-header-nt">' + data[0][0].FirstName + '</div>' + 
       '<div class="hfpm-ng-one-nt">' + data[0][0].LastName + '</div>' + 
      '</div>' + 
      '<div class="hfpm-News-nt">' + 
       '<div class="hfpm-header-nt">In the News</div>' + returnedFeedShortcode + 
      '</div>' + 
     '</div>'; 
    $('#personPageHead-nt').html(head); 
} 

$(document).ready(function() { 
    if($('#personPageHead-nt').length) { 
     getNewsPerson(location.search); 
    } 
}); 

function return_tagname(data) { 
    var tagname = data[0][0].FirstName + '+' + data[0][0].LastName; 
    return do_shortcode('[rss feed="http://website/tag/' + tagname + '/feed/" num="3"]'); 
}; 

回答

2

通過JavaScript添加簡碼是行不通的。由於PHP已經在頁面上運行,所以不會被處理。您需要通過AJAX調用來處理短代碼,並將該HTML返回給javascript函數,而不是標記名。

以下是您的JavaScript調用。你不應該在這裏有do_shortcode。這是一個PHP調用,需要在您的functions.php文件中,我將在後面顯示。

var getNewsPerson = function() { 
    $.ajax({ 
     url:"http://website/api/v1/api?pid=" + personId, 
     type:"get", 
     success:function(res) { 
      processPerson(res); 
     } 
    }); 
}; 

function processPerson(data) { 
    var returnedFeedShortcode = return_tagname(data); 
    var head = 
     '<div class="headForPerson-nt">' + 
      '<div class="hfpm-NextPerson-nt">' + 
       '<div class="hfpm-header-nt">' + data[0][0].FirstName + '</div>' + 
       '<div class="hfpm-ng-one-nt">' + data[0][0].LastName + '</div>' + 
      '</div>' + 
      '<div class="hfpm-News-nt">' + 
       '<div class="hfpm-header-nt">In the News</div>' + returnedFeedShortcode + 
      '</div>' + 
     '</div>'; 
    $('#personPageHead-nt').html(head); 
} 

$(document).ready(function() { 
    if($('#personPageHead-nt').length) { 
     getNewsPerson(location.search); 
    } 
}); 

function return_tagname(data) { 
    var tagname = data[0][0].FirstName + '+' + data[0][0].LastName; 
    var requestData = { 
     'action': 'return_tagname', 
     'tagname': tagname 
    }; 
    $.ajax({ 
     url: MyAjax.ajaxurl, 
     data: requestData, 
     success: function(tagdata) { 
      return tagdata; 
    } 
}) 
}; 

這是需要你的functions.php文件添加什麼:

//You need to do this when enqueuing your javascript so that you have access to the Wordpress AJAX URL. The contents of this function can be added to your current function that is enqueuing your styles and scripts. 
function my_enqueue_script(){ 
    // declare the URL to the file that handles the AJAX request (wp-admin/admin-ajax.php) 
    wp_localize_script('my-ajax-request', 'MyAjax', array('ajaxurl' => admin_url('admin-ajax.php'))); 
} 
add_action('wp_enqueue_scripts', 'my_enqueue_script'); 

//The 'action data ('return_tagname') sent in the ajax call will tell Wordpress to use this function. You need to have it end in _callback. 
function return_tagname_callback(){ 
    //$_POST['tagname'] is coming from the AJAX post made in the return_tagname function on the javascript side. do_shortcode will return the result of the function. 
    return do_shortcode('[rss feed="http://website/tag/' + $_POST['tagname'] + '/feed/" num="3"]'); 
} 
add_action('wp_ajax_my_action', 'return_tagname_callback'); 
add_action('wp_ajax_nopriv_my_action', 'return_tagname_callback'); 
+0

我不確定您的意思是「通過AJAX調用處理短代碼」。我創建了return_tagname()並把它返回到AJAX調用生成的html中,但是我在函數的return語句中得到了「wp_rss未定義」。我已經嘗試使用「do_shortcode」和「add_shortcode」,但我添加到functions.php的代碼似乎說使用「wp_rss」,所以我去了。有任何想法嗎? –

+0

由於您使用的是AJAX,因此您必須在functions.php中運行do_shortcode並返回值。您使用的文檔可能不是使用AJAX。發佈AJAX調用的整個JavaScript部分到您的問題,我會確保這是正確的。 – Fencer04

+0

已添加。沒有嘗試添加rss feed所有其他部分的工作,所以我不認爲我在其他地方有一些錯誤,它搞砸了,但它總是可能的。 –

1

對於RSS訂閱您可以使用此。將其粘貼到您的模板頁面上。

<?php 
    $curl = 
    curl_init('http://website.com/tag/'); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
    $page = curl_exec($curl); 
    if(curl_errno($curl)) // check for execution errors 
    { 
    echo 'Scraper error: ' . curl_error($curl); 
    exit; 
    } 
    curl_close($curl); 
    $regex = '/<table class="StoryengineTable">(.*?)<\/div>/s'; 
    if (preg_match($regex, $page, $list)) 
    echo $list[0]; 
    else 
    print "Not found"; 
    ?>