根据获取值自动选择新帖子的类别

时间:2016-10-21 作者:Rashod Chamikara Bandara

我正在管理面板中寻找解决方案,当管理员单击特定链接添加新帖子时,会根据GET value自动选择一个或多个类别。

例如,如果管理员单击fallowing链接wp-admin/post-new.php?cat=news在“添加新帖子”页面中,自动选中news 类别选择部分中的类别。

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

如果您开始编辑一篇新文章,则已经有一篇状态为auto-draft 已创建。实际上,你看到的是这篇文章。因此,您可以连接到过渡过滤器new_to_auto-draft 并在此帖子中添加一个类别:

add_action( \'new_to_auto-draft\', function(  $post ) {
    // Bail out, if not in admin editor.
    if ( ! strpos( $_SERVER[\'REQUEST_URI\'], \'wp-admin/post-new.php\' ) ) {
        return;
    }

    // Bail out, it no category set in $_GET.
    if ( empty( $_GET[\'cat\'] ) ) {
        return;
    }

    $cat = wp_unslash( $_GET[\'cat\'] );

    // Bail out, if category does not exist.
    if ( false === ( $cat = get_category_by_slug( $cat ) ) ) {
        return;
    }

    wp_set_post_categories( $post->ID, array( $cat->term_id ) );

} );
解释正如我所说,当你打开编辑器时,马上就会创建一篇文章。wp_insert_post() 正在呼叫wp_transition_post_status( $new_status, $old_status, $post ) 其中$new\\u状态为auto-draft 旧的“状态”是new. wp_transition_post_status() 基本上有三个动作挂钩:

我正在使用{$old_status}_to_{$new_status} (new_to_auto-draft) 因为这是你想要完成的最精确的目标。

在函数中,我们获取post对象作为参数($post), 如果我们不在正确的位置或$_GET[\'cat\'] 找不到。具有wp_unslash() 我们从中删除“\\”和其他内容$_GET[\'cat\']. 另一种可能是使用sanitize_key(), 也许这更合适。

现在,我们使用get_category_by_slug() 因为我们需要类别的ID才能将帖子附加到中的类别wp_set_post_categories(). 如果未找到类别get_category_by_slug() 将返回false 然后我们就退出了。另一个想法是,如果找不到类别,就用这个slug创建一个类别。

用于自定义帖子类型和自定义分类法,以响应

这似乎不适用于自定义帖子类型/分类法

上面的示例显式地作用于post类型post 以及分类学category. 如果要将其与自定义帖子类型和自定义TaxonononMy一起使用,则需要使用get_term_by() 而不是get_category_by_slug() 您需要使用wp_set_object_terms() 而不是wp_set_post_categories().

下面的示例注册了一个post类型、一个分类法,并显示了该过程:

add_action( \'new_to_auto-draft\', function(  $post ) {
    // Bail out, if not in admin editor.
    if ( ! strpos( $_SERVER[\'REQUEST_URI\'], \'wp-admin/post-new.php\' ) ) {
        return;
    }

    // Bail out, it no category set in $_GET.
    if ( empty( $_GET[\'post_type\'] ) || \'post_slug\' !== wp_unslash( $_GET[\'post_type\'] ) ) {
        return;
    }

    // Bail out, it no category set in $_GET.
    if ( empty( $_GET[\'cat\'] ) ) {
        return;
    }

    $cat = wp_unslash( $_GET[\'cat\'] );

    // Bail out, if category does not exist.
    if ( false === ( $cat = get_term_by( \'slug\', $cat, \'tax\' ) ) ) {
        return;
    }

    wp_set_object_terms( $post->ID, array( $cat->term_id ), \'tax\' );

} );
add_action ( \'init\', function() {
    $args[\'label\'] = \'Test\';
    $args[\'public\'] = TRUE;
    register_post_type( \'post_slug\', $args );

    $args[\'label\'] = \'Taxonomy\';
    register_taxonomy( \'tax\', \'post_slug\', $args );
});