Name/Word Replacement Plugin

时间:2017-05-26 作者:Timberwolf

我如何制作一个插件,允许我用真名写条目,但用指定的“假”名称显示条目,以保护作者和被书写者的身份,而无需作者手动映射和替换。我也不想在插件不工作的情况下显示它。例如,如果插件不再工作,则显示“entry Temporary unavailable”或类似内容。

示例:

今天我和詹姆斯去了商店。

将显示为

今天我和托马斯去了商店。

它会将James=Thomas保存在数据库中,并且不会将Thomas用作任何其他名称。

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

可能有一两个插件可以做到这一点(或者可以修改为),但它可以通过三个非常简单的php函数分两步解决。

快速方法可能是1) 为应用于作者的作者别名添加用户元框。然后2) 钩住the_content 过滤器和preg_replace 文章内容中别名的作者姓名。

这可以添加到函数中。模板的php文件。

(注意:我们必须挂接两个位置,这取决于用户是访问页面还是管理员)。

第一步:编写Alias元框并保存函数

add_action( \'show_user_profile\', \'adding_author_content_alias\' );
add_action( \'edit_user_profile\', \'adding_author_content_alias\' );

function adding_author_content_alias( $user ) { 

    if( user_can( $user, \'edit_posts\' ) ) { //hiding this box from users below author level
        ?>

        <h3>Author Alias</h3>

        <table class="form-table">

            <tr>
                <th><label for="author-alias">Author Alias</label></th>

                <td>
                    <input type="text" name="author-alias" id="author-alias" value="<?php echo esc_attr( get_the_author_meta( \'author-alias\', $user->ID ) ); ?>" class="regular-text" /><br />
                    <span class="description">Add your Author Alias.</span>
                </td>
            </tr>

        </table>
        <?php 
    }//end if user_can
}//end adding_author_content_alias()

add_action( \'personal_options_update\',  \'save_author_content_alias\' );
add_action( \'edit_user_profile_update\', \'save_author_content_alias\' );

function save_author_content_alias( $user_id ) {

    if ( !current_user_can( \'edit_user\', $user_id ) ) {
        return false;
    }
    if ( isset( $_POST[\'author-alias\'] ) ) {
        update_usermeta( $user_id, \'author-alias\', sanitize_text_field( $_POST[\'author-alias\'] ) );
    }
}//end save_author_content_alias()
quick note:adding_author_content_alias 上述方法,我们正在使用[user_can][1] not current_user_can 因此,我们可以传递正在查看的配置文件的用户对象,而不是查看器的对象或id,并检查CAP。

第二步:使用作者姓名和别名过滤\\u内容

有了上面的新用户元,我们可以过滤the_content 很容易:

add_filter( \'the_content\', \'our_content_filter_function\' );

function our_content_filter_function($content) {
    if( in_the_loop() && is_main_query() ) {

        $author = get_the_author();
        $author-alias = get_the_author_meta( \'author-alias\' );

        $name_parts = explode(\' \', $author); 
        $first_name = name_parts[0];
        $first_name = trim($first_name);

        $content = preg_replace( $first_name, $author-alias, $content );
        return $content;

    }//end if

    return $content;

}//end our_content_filter_function() 
如果上述三个函数和五个钩子(或它们的某个版本)的方法能够满足您的需要,那么这三个函数和五个钩子应该可以发挥作用。

结束;)

-下面的所有内容只是对那些寻找起点的人的进一步解释;)

我将为其他寻找类似起点的人安排更多细节:

1) 以上假设作者的“显示名”按顺序设置为“第一名”和“姓氏”。如果作者的显示名称设置为仅第一个名称,则只需剪切$name_parts/expode/$first_name 塞满东西。设置$first_name = $author; 或者在preg_replace().

2) 您可以使用php的[list][1] 如果您的php版本不会更改。

3) 如果您希望将别名分配给作者的控制范围之外的其他人,您可以在db中将其作为选项进行元键/赋值。然后根据作者名称匹配作者键,并将键和值设置为preg_replace()\'spatternreplacement, 分别地

4) 如果您不希望替换网站上出现的所有作者姓名(或在序列化文本中交换角色名称等诸如此类的事情),您可以为这两者传递数组patternreplacement. 下面将介绍更多信息。

注:Wordpressthe_content filter, 因为它是在显示帖子之前应用的,并将帖子的内容作为字符串公开为$content.我们没有更改数据库中的任何数据,而是在查询之后和显示之前更改这些数据。现在已经足够晚了,任何主题或插件都应该能够跳到这里,因此下面的内容可以进入主题的功能中。php没有问题。

add_filter( \'the_content\', \'our_content_filter_function\' );

要记住的一件事是,您可能希望检查它是否正在处理主查询。我们使用了推荐的[is_main_query()][2][in_the_loop()][2] 因此,如果您需要在二次查询中更改内容,您可能希望将其排除在外。

 function our_content_filter_function($content) {
      if ( in_the_loop() && is_main_query() ) {
         //do stuff to $content here
           return $content;
     }
    return $content;
}
注:如上所述,PHPpreg_replace() 可以接受阵列用于阵列和替换,and 如果对它们进行键控和排序,它将匹配它们。所以$pattern[2] 将替换为$replacement[2]. 但你必须[ksort()][2] 这些数组,否则它将按照它们在代码中输入的顺序匹配它们;看见example 2 on php.net 了解更多信息。

根据您的需要,将James替换为Thomas(我将为阵列添加更多):

 $pattern = array();
 $pattern[0] = \'James\';
 $pattern[1] = \'Larry\';
 $pattern[2] = \'Moe\';
 $pattern[3] = \'Curly\';

 $replacement = array();
 $replacement[1] = \'Groucho\';
 $replacement[0] = \'Thomas\';
 $replacement[3] = \'Chico\';
 $replacement[2] = \'Harpo\';

//makes sure our 1s match our 1s, and 2s match our 2s
ksort($pattern);
ksort($replacement);

//add in our $content string

preg_replace($pattern, $replacement, $content);
现在作为过滤器和回调:

add_filter( \'the_content\', \'our_content_filter_function\' );

function our_content_filter_function($content) {
    if( in_the_loop() && is_main_query() ) {
         $pattern = array();
         $pattern[0] = \'James\';
         $pattern[1] = \'Larry\';
         $pattern[2] = \'Moe\';
         $pattern[3] = \'Curly\';

         $replacement = array();
         $replacement[1] = \'Groucho\';
         $replacement[0] = \'Thomas\';
         $replacement[3] = \'Chico\';
         $replacement[2] = \'Harpo\';

         //makes sure our 1s match our 1s, and 2s match our 2s
         ksort($pattern);
         ksort($replacement);

        //add in our $content string

       preg_replace($pattern, $replacement, $content);
       return $content;
    }
    return $content;
}

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register