向帖子页面添加辅助编辑框

时间:2012-11-13 作者:Amanda Duke

我运行一个多作者平台,为了改进调节,我想添加几个辅助编辑器。我想在帖子页面中添加一个自定义框,辅助编辑可以在其中确认他们已经完成了哪些任务。

因此,此框将包含选项清单,例如:

    1 => \' Proofread \',
    2 => \' Graphics Added \',
    3 => \' SEO Fixed \',
    4 => \' Ready for Publish \'
然后包含一个清单,列出所有辅助编辑(可以edit_published_posts) 在那里,用户可以将自己标记为对编辑做出了贡献。

该框可能如下所示:

Editorial Tasks

最后,在前端帖子页面上,我想列出哪些用户编辑了帖子。

为了做到这一点,我有以下代码:

add_action( \'add_meta_boxes\', \'assisting_editor\' );
function assisting_editor() {
    add_meta_box(
        \'assisting_editor\', // id, used as the html id att
        __( \'Editorial Tasks\' ), // meta box title
        \'editor_tasks\', // callback function, spits out the content
        \'post\', // post type or page. This adds to posts only
        \'side\', // context, where on the screen
        \'low\' // priority, where should this go in the context
    );

}

function editor_tasks( $post ) {
    global $wpdb;
    $value = get_post_meta($post->ID, \'rating\', true);
    echo \'<div class="misc-pub-section misc-pub-section-last"><span id="timestamp"><label>Editorial tasks: </label>\';

    $ratings = array(
        1 => \' Proofread \',
        2 => \' Graphics Added \',
        3 => \' SEO Fixed \',
        4 => \' Ready for Publish \'
    );

    echo \'<select name="rating">\';
    echo \'<option value=""\' . ((($value == \'\') || !isset($ratings[$value])) ? \' selected="selected"\' : \'\') . \'> Untouched </option>\';

    // output each rating as an option
    foreach ($ratings as $id => $text) {
        echo \'<option value="\' . $id . \'"\' . (($value == $id) ? \' selected="selected"\' : \'\') . \'">\' . $text. \'</option>\';
    }
    echo \'</select>\';

    echo \'</span></div>\';
}

add_action( \'save_post\', \'save_metadata\');

function save_metadata($postid)
{   
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return false;
    if ( !current_user_can( \'edit_page\', $postid ) ) return false;
    if( empty($postid) ) return false;


    if ( is_null($_REQUEST["rating"]) ) {
        delete_post_meta($postid, \'rating\');
    } else {
        update_post_meta($postid, \'rating\', $_REQUEST[\'rating\']);
    }

}
However, 这段代码添加了一个下拉列表,而不是检查列表,更重要的是,它没有列出编辑器用户。

My question is: 我怎样才能制作一个像上面的图片一样的具有这些功能的方框,以及我怎样回应编辑过帖子的用户列表?

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

add_meta_box 应该给你一个盒子,就像你想象的那样。

您有一个选择下拉列表,因为这是您在此处创建的内容:

echo \'<select name="rating">\';
echo \'<option value=""\' . ((($value == \'\') || !isset($ratings[$value])) ? \' selected="selected"\' : \'\') . \'> Untouched </option>\';

// output each rating as an option
foreach ($ratings as $id => $text) {
    echo \'<option value="\' . $id . \'"\' . (($value == $id) ? \' selected="selected"\' : \'\') . \'">\' . $text. \'</option>\';
}
echo \'</select>\';
你需要一系列checkboxes. 在上面的代码中,您只需要foreach. 复选框的工作方式与选择的不同。下面将为您提供四个需要保存的不同值,每个值对应于$ratings 大堆

foreach ($ratings as $id => $text) {
    echo \'<input type="checkbox" name="\'.strtolower($text).\'" value="\' . $id . \'"\' . (($value == $id) ? \' selected="selected"\' : \'\') . \'"/><label for"\'.strtolower($text).\'">\'.$text.\'</label>\';
}
您可以将所有复选框按如下方式命名为一个数组:

foreach ($ratings as $id => $text) {
    echo \'<input type="checkbox" name="ratings[]" value="\' . $id . \'"\' . (($value == $id) ? \' selected="selected"\' : \'\') . \'"/><label for"ratings[]">\'.$text.\'</label>\';
}
在第一种情况下,您必须修改更新功能。第二,我相信你的功能会起作用,但我不能百分之百肯定。

获取要使用的作者列表get_users 使用who 参数设置为“authors”,根据codex,该参数将返回“用户级别大于0”。也就是说,每个不是订阅者的人——作者、编辑、贡献者等等。。。

$alleds = get_users(\'who=authors\');
再次检查是否已选择任何作者。

$currenteds = get_post_meta($post->ID, \'currenteds\', true);
然后是foreach 创建复选框,就像上面的$ratings. 您需要最后一个参数true 只有在数据库中另存为单个条目时,这种情况才有意义。

foreach ($alleds as $ed) {
    $checked = (in_array($ed->ID,$currenteds)) ? \'checked="checked"\' : \'\';
    echo \'<input type="checkbox" name="currenteds[]" value="\' . $ed->ID . \'"\' . $checked . \'"/><label for"ratings[]">\'.$ed->user_nicename.\'</label>\';
}
当然还有另一个update_post_meta 阻止以保存字段。

if ( is_null($_REQUEST["currenteds"]) ) {
    delete_post_meta($postid, \'currenteds\');
} else {
    update_post_meta($postid, \'currenteds\', $_REQUEST[\'currenteds\']);
}
我想是的。

此外,您正在将脏数据传递给这些函数。我不会讲课,但会查找“数据验证”和“数据清理”。)

下面是整件事,包括一些拼写错误更正和bug修复。我们的编辑们也为类似的事情对我进行了窃听,所以我对它进行了模拟:)。格式不存在,但可以使用。我将其作为插件进行了测试,所以请自己构建一个plugin header. 我不知道它是否会从function.php.

// author checkboxes
add_action( \'add_meta_boxes\', \'assisting_editor\' );
function assisting_editor() {
    add_meta_box(
        \'assisting_editor\', // id, used as the html id att
        __( \'Editorial Tasks\' ), // meta box title
        \'editor_tasks\', // callback function, spits out the content
        \'post\', // post type or page. This adds to posts only
        \'side\', // context, where on the screen
        \'low\' // priority, where should this go in the context
    );

}

function editor_tasks( $post ) {
    global $wpdb;
    $value = get_post_meta($post->ID, \'ratings\', true);

    echo \'<div class="misc-pub-section misc-pub-section-last"><span id="timestamp"><label>Editorial tasks: </label>\';

    $ratings = array(
        1 => \' Proofread \',
        2 => \' Graphics Added \',
        3 => \' SEO Fixed \',
        4 => \' Ready for Publish \'
    );

    foreach ($ratings as $id => $text) {
    $checked = (in_array($id,(array)$value)) ? \' checked="checked"\' : \'\';
    echo \'<input type="checkbox" name="ratings[]" value="\' . $id . \'"\'.  $checked . \'/><label for="ratings[]">\'.$text.\'</label>\';
    }

    $qry[\'relation\'] = \'OR\';
    $qry[] = array(
      \'key\' => $wpdb->prefix.\'capabilities\',
      \'value\' => \'editor\',
      \'compare\' => \'like\'
    );
    $qry[] = array(
      \'key\' => $wpdb->prefix.\'capabilities\',
      \'value\' => \'administrator\',
      \'compare\' => \'like\'
    );
    $qry = array(\'fields\' => \'all_with_meta\',\'meta_query\'=>$qry);

    $alleds = get_users($qry);

    $currenteds = get_post_meta($post->ID, \'currenteds\', true);

    foreach ($alleds as $ed) {
    $checked = (in_array($ed->ID,(array)$currenteds)) ? \' checked="checked"\' : \'\';
    echo \'<input type="checkbox" name="currenteds[]" value="\' . $ed->ID . \'"\' .$checked . \'"/><label for="ratings[]">\'.$ed->user_nicename.\'</label>\';
    }
    echo \'</span></div>\';
}

add_action( \'save_post\', \'save_metadata\');

function save_metadata($postid)
{   
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return false;
    if ( !current_user_can( \'edit_page\', $postid ) ) return false;
    if( empty($postid) ) return false;

    if ( is_null($_REQUEST["ratings"]) ) {
        delete_post_meta($postid, \'ratings\');
    } else {
        update_post_meta($postid, \'ratings\', $_REQUEST[\'ratings\']);
    }

    if ( is_null($_REQUEST["currenteds"]) ) {
    delete_post_meta($postid, \'currenteds\');
    } else {
    update_post_meta($postid, \'currenteds\', $_REQUEST[\'currenteds\']);
    }
}

function display_current_eds($ID = \'\') {
  if (empty($ID)) {
    global $post;
    if (!empty($post)) {
      $ID = $post->ID;
    }
  }
  if (empty($ID)) return false;
  $eds = get_post_meta($post->ID,\'currenteds\',true);
  if (!empty($eds)) {
    foreach ($eds as $e) {
      $edu = get_userdata($e);
      $edusers[] = sprintf(
        \'<a href="%1$s" title="%2$s" rel="author">%3$s</a>\',
        get_author_posts_url( $edu->ID, $edu->user_nicename ),
        esc_attr( sprintf( __( \'Posts by %s\' ), $edu->user_nicename ) ),
        $edu->user_nicename
      );
    }
    return $edusers;
  }
  return false;
}

function authors_content_filter($content) {
  $authors = display_current_eds();
  if (false !== $authors) {
    $content .= implode(\', \',$authors);
  }
  return $content;
}
add_filter(\'the_content\',\'authors_content_filter\');

    // add author checkboxes
Theadd_filter 将自动显示作者。要手动显示作者,请在循环中使用以下内容:

$edusers = display_current_eds();
if (false !== $edusers) {
    echo implode(\', \',$edusers);
}
我将把它留给你们来解决格式和其他问题。我认为这个问题现在已经得到了充分的回答。

结束

相关推荐

删除Yoast SEO帖子Metabox

Yoasts SEO插件在后期编辑屏幕中添加了一个元框。我正在尝试为非编辑或更高级别的用户删除此项。我试着把remove_meta_box 在admin\\u init上调用,尝试删除$wpseo\\u metabox上的操作,但没有效果。如何在不需要用户干预的情况下删除此元数据库(用户永远不会知道该元数据库存在,因此单击屏幕选项不是一个选项)