根据事件显示内容

时间:2015-12-09 作者:Luis Rock

好的,我正在构建这个成员插件。

插件将用户发送到一个数字支付网站,该网站在操作后将用户发送回带有代码(POST)的wp网站,发送到用户选择的页面(在插件的选项面板上)。插件侦听此帖子,获取代码并wp_remote_get 请求数字支付API,由其通知插件支付是否成功。

我的目标是在网关发回的同一页面上向用户显示付款状态(活动、挂起或取消)。

我的代码是这样的(省略变量):

function wxy_listener(){

if( !isset( $_GET[\'code\'] ) ){ 
    return false;
}  
  if( !isset( $_GET[\'returnfrom\'] ) || \'ps\' != $_GET[\'returnfrom\'] ){ 
    return false;
}

$code = $_GET[\'code\'];

global $wxy_options;
$psToken = ...;
$psEmail = ...;
$psSandbox = ...;
//URL for the first HTTP POST request
$psUrl = ...;
//If Sandbox is on, we should set  different URL...

if ($psSandbox === "1") {
  $psToken = ...;
  $psEmail = ...;
  $psUrl = ...;
}
$user_info = wp_get_current_user();
$user_email = $user_info->user_email;

$response = wp_remote_retrieve_body( wp_remote_get( $psUrl ) );
if( is_wp_error( $response ) ) {
                // There was an error
                $error_message = $response->get_error_message();
                wxyLog($error_message);
      return false;
    }

$resp_xml = simplexml_load_string($response);
if ($resp_xml === false) {
 wxyLog(\'Failed loading RESP_XML\');  
 return false;    
 } 

  $subsc_status = $resp_xml->status;

        // HOW TO ECHO THE STATUS AT THIS MOMENT ON THE PAGE, INSIDE THE CONTENT (AFTER OR BEFORE)?    

}
add_action(\'init\',\'wxy_listener\');
我可以用the_content 过滤器,但在函数内部?据我所知,我不应该这样做。

我确实认为这是一个愚蠢的问题,但是。。。

2 个回复
最合适的回答,由SO网友:jgraup 整理而成

如果您必须在内容之前/之后添加我们的消息,那么您必须使用“the\\u content”过滤器。如果您将消息放在一个短代码或挂钩中,这样主题定制就会更加集成,这会更好。但基本上,在运行逻辑以获取状态之后,只需等待消息显示出来。

add_action(\'init\',\'wxy_listener\');

function wxy_before_the_content ( $content ) {
    $status = get_subsc_status_message();
    if(!empty($status)){
        $custom_content = \'<div class="my-plugin-message">\'.$status.\'</div>\';
    } else return $content; // no status info
    $custom_content .= $content;
    return $custom_content;
}

function wxy_after_the_content ( $content ) {
    $custom_content = \'AFTER CONTENT GOES HERE\';
    $content .= $custom_content;
    return $content;
}

function get_subsc_status_message()
{
    global $subsc_status;
    if ( empty( $subsc_status) ) return \'\';

    $messages = array (
        \'ACTIVE\'    => __(\'Your stuff is active.\', \'text_domain\'),
        \'PENDING\'   => __(\'Your stuff is pending.\', \'text_domain\'),
        \'CANCELLED\' => __(\'Your stuff is cancelled.\', \'text_domain\'),
    );

    if ( isset( $messages[ $subsc_status ] ) {
        return $messages[ $subsc_status ];
    }

    return \'\';
}

function wxy_listener(){

    if( !isset( $_GET[\'code\'] ) ){ 
return; // nobody is listening
    }

    if( !isset( $_GET[\'returnfrom\'] ) || \'ps\' != $_GET[\'returnfrom\'] ){ 
return; // nobody is listening
    }

    $code = $_GET[\'code\'];

    global $wxy_options;
    $psToken = ...;
    $psEmail = ...;
    $psSandbox = ...;

    // URL for the first HTTP POST request
    $psUrl = ...;

    // If Sandbox is on, we should set  different URL...
    if ($psSandbox === "1") {
        $psToken = ...;
        $psEmail = ...;
        $psUrl = ...;
    }

    $user_info = wp_get_current_user();
    $user_email = $user_info->user_email;

    $response = wp_remote_retrieve_body( wp_remote_get( $psUrl ) );
    if( is_wp_error( $response ) ) {
        // There was an error
        $error_message = $response->get_error_message();
        wxyLog($error_message);
return; // nobody is listening
    }

    $resp_xml = simplexml_load_string($response);
    if ($resp_xml === false) {
        wxyLog(\'Failed loading RESP_XML\');  
return; // nobody is listening 
    } 

    // store the response for later
    global $subsc_status;
    $subsc_status = $resp_xml->status; 

    // add hooks to the content
    add_filter( \'the_content\', \'wxy_before_the_content\', 0 );
    add_filter( \'the_content\', \'wxy_after_the_content\', 99 );
}

SO网友:s_ha_dum

您的代码在上运行initthe_content 已调用筛选器。你没有理由不参与其中。它应该简单到:

add_filter(
  \'the_content\',
  function ($content) use ($subsc_status) {
    return $content.\' || \'. $subsc_status;
  }
);

相关推荐

检查POST_CONTENT中有哪些Gutenberg块

如果某个古腾堡积木出现在页面上,我正在设计一种具有不同风格的设计。换句话说,如果第一个块是自定义构建的Gutenberg块,则post\\u标题将根据所做的设计选择在其他地方呈现。WordPress中是否有任何函数可以获取post\\u内容中存在的所有Gutenberg块的列表?