通过另一个插件的插件添加功能

时间:2017-02-15 作者:thatryan

我制作了一个插件,在某些情况下,我需要为GravityView中的订阅者角色添加一些功能。

我想用user_has_cap 过滤以使其工作does 只是没有在正确的时间添加大写字母,所以GravityView认为用户没有正确的大写字母。

我在插件中包含了一个文件,就是这段代码,(删掉了一些注释等)

add_filter( \'user_has_cap\', \'sqms_user_has_cap_filter\' );
function sqms_user_has_cap_filter( $allcaps, $caps, $args, $user ) {

    // Only do this mess if the page being viewed is a dealer landing page
    if ( ! is_singular( \'sqms_payne_dealer\' ) ) {
        return $allcaps;
    }

    // This is meta from a dropdown of CPT that is added to user profield via CMB2
    $dealer_slug = get_user_meta( get_current_user_id(), \'sqms-product-dealer-id\', true );

    if ( $dealer_slug ) {

        // This is the only (ugly ass) way I found to get the CPT ID via the page slug
        $page_path = \'sqms_payne_dealer/\' . $dealer_slug;
        $dealer_page = get_page_by_path( basename( untrailingslashit( $page_path ) ), OBJECT, \'sqms_payne_dealer\');

        // Make sure the page being viewed belongs to the logged in dealer
        if ( $dealer_page->ID === get_queried_object_id() ) {

            $needed_caps = array( \'gravityforms_view_entry_notes\', \'gravityview_add_entry_notes\', \'gravityview_view_entry_notes\', \'gravityforms_edit_entry_notes\' );

            foreach ( $needed_caps as $cap ) {
                $allcaps[ $cap ] = true;
            }
        }
    }

    return $allcaps;
}
两个问题:

获取使用的错误is_singular() 这里是因为它显然在查询之前。。。

如果我删除了该支票,则在get_queried_object_id() 说它是空的。

我不知道如何继续,正在这里寻找任何输入。如果不是很明显,我想only 为当前登录的用户提供上限if 他们正在查看我通过user\\u meta分配给他们的单一页面。

非常感谢。

1 个回复
SO网友:Nathan Johnson

这里有几个问题:

  1. is_singular() 如果在设置WP\\U查询对象之前调用函数,将返回falseuser_has_cap 钩子很早而且经常触发—在设置WP\\u查询之前,我们知道WP\\u查询对象是在wp 钩子,因此可以使用该操作钩子为user_has_cap.

    add_action( \'wp\', \'sqms_wp_action\' );
    function sqms_wp_action() {
      //* Since the WP_Query object is set, is_singular() should work properly
      if ( ! is_singular( \'sqms_payne_dealer\' ) ) {
        return;
      }
      add_filter( \'user_has_cap\', \'sqms_user_has_cap_filter\' );
    }
    function sqms_user_has_cap_filter() {
      //* No need for is_singular() check
      //* Rest of code unchanged
    }
    
    因此,您的大多数代码都是正确的。只是执行顺序不对。

相关推荐

Capabilities Not Changing

我希望编辑器能够列出、添加和编辑用户。我认为下面的代码可以做到这一点,但它不起作用-没有为任何编辑器显示新的用户菜单。我错过什么了吗?function increase_editor_role(){ $role = get_role(\'editor\'); $role->add_cap(\'list_users\'); $role->add_cap(\'edit_users\'); $role->add_cap(\'c