在ADD_MENU_PAGE()中可以有动态帖子id#吗?

时间:2015-07-07 作者:codeview

我在自定义主题构建中使用add\\u menu\\u page功能,但当我导出网站的本地副本并将其导入生产网站时,一些帖子id号会更改,我必须手动更新此功能(即:在下面的代码中:?post=8, ?post=8, ?post=10). 有没有办法让这些数字保持动态?

function custom_admin_menu_links() {
    $user = wp_get_current_user();
    if ( ! $user->has_cap( \'manage_options\' ) ) {
        add_menu_page( \'Home\', \'Home\', \'edit_posts\', \'post.php?post=6&action=edit\', \'\', \'dashicons-admin-home\', 1);
        add_menu_page( \'About\', \'About\', \'edit_posts\', \'post.php?post=8&action=edit\', \'\', \'dashicons-id\', 2);
        add_menu_page( \'Contact\', \'Contact\', \'edit_posts\', \'post.php?post=10&action=edit\', \'\', \'dashicons-phone\', 3);
    }
}
add_action( \'admin_menu\', \'custom_admin_menu_links\' );

2 个回复
SO网友:webtoure

有一个函数称为get_page_by_title 它接受帖子标题并返回该帖子的ID。您甚至可以将其与get_edit_post_link 通过传递ID并检索编辑链接。

然而,你怎么能确定这篇文章的标题永远不会改变?您可以进一步添加一个设置页面,将特定的帖子/页面映射到一个实体,例如HOME_ID, ABOUT_ID 等等,而不是使用get_page_by_title 您只需进行此设置array 你可以建造这些add_menu_page 像这样的呼叫:

if ( ! $user->has_cap( \'manage_options\' ) ) {
    $options = get_option( \'wt_menu_post_ids\', array() );

    add_menu_page( \'Home\', \'Home\', \'edit_posts\', get_edit_post_link( $options[\'HOME_ID\'] ), \'\', \'dashicons-admin-home\', 1);
    // [...]
}

SO网友:s_ha_dum

快速而肮脏的答案是这样的:

function custom_admin_menu_links() {
  $user = wp_get_current_user();
  if (  $user->has_cap( \'manage_options\' ) ) {
    $type = \'book\';

    $page = get_page_by_title(\'home\',\'object\',$type);
    if (!empty($page)) {
      add_menu_page( \'Home\', \'Home\', \'edit_posts\', \'post.php?post=\'.$page->ID.\'&action=edit\', \'\', \'dashicons-admin-home\', 1);
    }

    $page = get_page_by_title(\'About\',\'object\',$type);
    if (!empty($page)) {
      add_menu_page( \'About\', \'About\', \'edit_posts\', \'post.php?post=8&action=edit\', \'\', \'dashicons-id\', 2);
    }

    $page = get_page_by_title(\'Contact\',\'object\',$type);
    if (!empty($page)) {
      add_menu_page( \'Contact\', \'Contact\', \'edit_posts\', \'post.php?post=10&action=edit\', \'\', \'dashicons-phone\', 3);
    }
  }
}
add_action( \'admin_menu\', \'custom_admin_menu_links\' );
但是您在每次加载管理页面时都会运行大量查询。您真的应该找到一种缓存结果的方法。类似于:

function cache_custom_admin_menu_links($post_ID, $post) {
  $links = get_option(\'my_menu_links\');

  $keys = array(
    \'home\',
    \'about\',
    \'contact\'
  );

  if (in_array($post->post_name,$keys)) {
    $links[$post->post_name] = $post_ID;

    update_option(\'my_menu_links\',$links);
  }
}
add_action(\'save_post\',\'cache_custom_admin_menu_links\',10,2);

function custom_admin_menu_links() {
  $user = wp_get_current_user();

  if (  $user->has_cap( \'manage_options\' ) ) {
    $type = \'book\';
    $links = get_option(\'my_menu_links\');
    $i = 1;
    foreach ($links as $k=>$v) {
      add_menu_page( $k, ucfirst($k), \'edit_posts\', \'post.php?post=\'.$v.\'&action=edit\', \'\', \'dashicons-phone\', $i);
      $i++;
    }
  }
}
add_action( \'admin_menu\', \'custom_admin_menu_links\' );
然后你只需要重新保存你的帖子,而不是编辑代码。我相信,如果你需要的话,即使这样也可以实现自动化。

结束

相关推荐

CURRENT_USER_CAN(‘EDIT_POST’,$POST_ID)不适用于贡献者,而适用于管理员

我有一个名为project 其中\'capability_type\' => \'post\' 使用注册时register_post_type.在我的主题文件中functions.php 文件中,我需要检查要编辑的项目是否由用户编写。所以我用这个:if ( !current_user_can( \'edit_post\', $porject_id ) ) return; 在哪里$project_id 是要编辑的项目的帖子id。例如,我有一个名为single_project.php