不包括通过IP发布的私人/受保护帖子

时间:2011-10-18 作者:user652650

我基本上希望WP中受密码保护的/私有页面/帖子能够像当前一样工作,但完全不考虑某些IP地址的功能。

我已经查看了过滤器/操作,但没有看到任何有希望的内容,我还是希望这样做时不要创建特定的类别或wordpress中当前功能之外的任何内容。

谢谢

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

绕过受密码保护的帖子,不幸的是,你对缺少过滤器的看法是正确的,对核心进行黑客攻击是不可避免的。一个似乎有效的解决方案围绕sanitize_post_field() 函数,如果其$context 参数未设置为raw.

负责决定是否显示密码字段或内容的模板函数是http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post-template.php#L556

请注意,将post_password? 让我们开始吧。。。

查看如何通过get_post() 功能:http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post.php#L370

该函数不包含要挂接的筛选器或操作,但sanitize_post_field() 包含一些可以连接到的筛选器,以及post_password 完成该功能。

请参考功能http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post.php#L1676

然而,请注意,如果$context == \'raw\'; 函数返回,并且没有任何筛选器被触发。因此,需要进行一些核心黑客攻击,以使代码流到达这些过滤器。

// wp-includes/post.php, line 557
-- $post = get_post($post);
++ $post = get_post($post, null, \'display\');
将强制$context 除了raw. 这将允许按照以下思路进行操作:

function wpse31407_bypass_password( $value, $post_id, $context ) {
    $allowed_ips = array( \'127.0.0.1\', \'255.255.255.255\', ... );
    if (in_array( $_SERVER[\'REMOTE_ADDR\'], $allowed_ips )) return \'\';
    else return $value;
}
add_filter( \'post_password\', \'wpse31407_bypass_password\', null, 3 );
这将有效地删除密码,因此测试http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/post-template.php#L556 if ( empty($post->post_password) ) 评估为true 允许您绕过密码。用一个display 上下文,因为它仅用于检索post_password.

您还可以在核心中围绕post_password_required() 上面提到的功能,可能不是为了使事情过于复杂。由你决定。

现在绕过私人帖子,至于私人帖子,请参阅此位或查询。phphttp://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/query.php#L2649 因为这是找到的帖子从私人条目中剥离出来的地方。

你会被诱惑http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/query.php#L2625 posts_results 过滤并进入并更改post_status 对于来自的每个帖子privatepublic... 然而,正如您可能已经看到的get_post_status() 函数处理其从中获取的帖子的自己副本get_post()... ...它同样没有过滤器sanitize_post_field() 是的,这同样需要$context 除了raw. 所以再说一遍:

// wp-includes/post.php, line 563
-- $post = get_post($post);
++ $post = get_post($post, null, \'display\');
并挂接到过滤器中,通过执行以下操作诱使函数认为帖子已发布:

function wpse31407_bypass_private( $value, $post_id, $context ) {
    $allowed_ips = array( \'127.0.0.1\', \'255.255.255.255\', ... );
    if (in_array( $_SERVER[\'REMOTE_ADDR\'], $allowed_ips )) return \'publish\';
    else return $value;
}
add_filter( \'post_status\', \'wpse31407_bypass_private\', null, 3 );
或者在get_post_status() 作用

结论

一旦你了解了核心的哪些部分是阻止帖子的原因,你可以根据需要尝试修改它们,因此我希望我的长答案在一定程度上有所帮助,有人会提供更多的提示,也许会提供更好的解决方案。好问题,让我挖掘和思考。

SO网友:user1489083

您不需要更改核心,只需将操作添加到pre_get_posts 然后进行检查:

add_action( \'pre_get_posts\', \'filter_anime_tax\' );
function filter_anime_tax( $query ) {
    $ip = getUserIP();
    $ip_data = geoip_record_by_name( $ip );
    if( $ip_data[\'country_code\'] != \'anything you want\' ) { 
        $query->set( \'post_status\', array( \'publish\', \'private\' ) );
    }
}
您可以显示或隐藏特定国家或IP的私人帖子。

结束

相关推荐

Integrating plugins in themes

我找不到讨论这个的帖子,所以开始这篇。我目前正在为3.1+开发一个相当复杂的主题,我的意思是,除了样式和常规的前端功能之外,我还在主题的核心包括后端和前端的插件。因此,为了使这一点更有条理,我将其分为三个问题:集成插件是一种常见的做法吗</自动更新主题/插件有什么影响/复杂之处</在不破坏现有功能的情况下,包含每个插件的最佳方式是什么