如何在“ wp-admin / post-new.php”中添加类别?


9

我想要一个链接来创建一个新的帖子,该帖子也设置了类别。

我曾尝试过wp-admin/post-new.php?post_category=12wp-admin/post-new.php?cat=12,但均无济于事。我也尝试使用名称而不是类别的ID。这也没有影响。

如何创建具有默认类别的新帖子的链接?

Answers:


4

GitHub上的Dave James Miller为我钉上了这个。这些工作都不是我的,我只是将他的代码包装在一个企鹅中,因为它的广告效果很好:

<?php
/**
 * Plugin Name: Set default category from url parameter
 * Plugin URI:  https://gist.github.com/davejamesmiller/1966543
 * Description: enables you to setup new post links with the post_title, category and tags in the url: <code><a href="<?= esc_attr(admin_url('post-new.php?post_title=Default+title&category=category1&tags=tag1,tag2')) ?>">New post</a></code>
 * Version:     0.0.1
 * Author:      davejamesmiller
 * Author URI:  https://gist.github.com/davejamesmiller
 */

// I used this code to automatically set the default post title, category and
// tags for a new WordPress post based on which link was clicked. It could also
// be tweaked to hard-code the values instead of using request parameters.


add_filter('wp_get_object_terms', function($terms, $object_ids, $taxonomies, $args)
{
    if (!$terms && basename($_SERVER['PHP_SELF']) == 'post-new.php') {

        // Category - note: only 1 category is supported currently
        if ($taxonomies == "'category'" && isset($_REQUEST['category'])) {
            $id = get_cat_id($_REQUEST['category']);
            if ($id) {
                return array($id);
            }
        }

        // Tags
        if ($taxonomies == "'post_tag'" && isset($_REQUEST['tags'])) {
            $tags = $_REQUEST['tags'];
            $tags = is_array($tags) ? $tags : explode( ',', trim($tags, " \n\t\r\0\x0B,") );
            $term_ids = array();
            foreach ($tags as $term) {
                if ( !$term_info = term_exists($term, 'post_tag') ) {
                    // Skip if a non-existent term ID is passed.
                    if ( is_int($term) )
                        continue;
                    $term_info = wp_insert_term($term, 'post_tag');
                }
                $term_ids[] = $term_info['term_id'];
            }
            return $term_ids;
        }
    }
    return $terms;
}, 10, 4);

使用上述方法效果很好,但是似乎无法正确加载依赖帖子类别的高级自定义字段(另一种流行的插件)规则(即,该类别的自定义字段不会加载)。有没有人想办法解决这个问题?
Aphire

9

进入wp_insert_post,测试的发布状态auto-draft,以及GET参数的URL 。

但是首先我们需要一个辅助函数来获取和清除GET参数:

/**
 * Set default category.
 *
 * @wp-hook pre_option_default_category
 * @return  string Category slug
 */
function t5_get_default_cat_by_url()
{
    if ( ! isset( $_GET['post_cat'] ) )
        return FALSE;

    return array_map( 'sanitize_title', explode( ',', $_GET['post_cat'] ) );
}

现在,自动草稿处理程序:

add_action( 'wp_insert_post', 't5_draft_category', 10, 2 );

/**
 * Add category by URL parameter to auto-drafts.
 *
 * @wp-hook wp_insert_post
 * @param   int $post_ID
 * @param   object $post
 * @return  WP_Error|array An error object or term ID array.
 */
function t5_draft_category( $post_ID, $post )
{
    if ( ! $cat = t5_get_default_cat_by_url()
        or 'auto-draft' !== $post->post_status )
        return;

    // return value will be used in unit tests only.
    return wp_set_object_terms( $post_ID, $cat, 'category' );
}

仅当get_default_post_to_edit()第二个参数$create_in_db设置为时才有效TRUE。要捕获其他情况,您必须过滤选项default_category

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

现在,您可以使用参数post_cat传递以逗号分隔的类别段列表:

在此处输入图片说明

也可以看看:


我尝试通过将代码粘贴到我的functions.php文件中来尝试此解决方案,但该方法无效。我想念什么吗?我是否需要做更多的工作,例如调用函数以使其完成工作?
杰米

@Jamie 没工作太模糊。:)
fuxia

我认为,通过将代码添加到functions.php中,当我打勾类别时,它将将该参数添加到字符串的末尾,如上图所示。我试图将metabox仅添加到特定类别。然后,我将使用$ _GET来测试是否属于正确的类别来加载元框。当我尝试代码并尝试复制上面照片中的内容时,什么也没发生。我所得到的只是wp-admin / post-new.php。我正在尝试获取wp-admin / post-new.php?post_cat = audio
Jamie

@Jamie该代码以另一种方式起作用:您手动构建链接(例如,通过电子邮件将其发送给某人),并且该代码将设置适当的类别。它不会创建任何链接。
fuxia

1

我认为您可以使用默认选项default_category并对它进行过滤option_default_category(如果url中有类别的参数,例如本示例源)。将其用作插件,对其进行测试。从头开始写,未经测试。

url参数是post_cat,您可以设置类别,例如以下url: /wp-admin/post-new.php?post_cat=categoryname

<?php
/**
 * Plugin Name: .my Test
 * Plugin URI:  http://bueltge.de/
 * Description: 
 * Version:     0.0.1
 * Author:      Frank B&uuml;ltge
 * Author URI:  http://bueltge.de/
 */
class Set_Default_Cat_From_Url_Param {

    protected static $classobj = NULL;

    public static function init() {

        NULL === self::$classobj and self::$classobj = new self();

        return self::$classobj;
    }

    function __construct() {

        if ( isset( $_GET['post_cat'] ) )
            add_filter( 'option_default_category', array( $this, 'get_category' ) );
    }

    function get_category( $category ) {

        if ( isset( $_GET['post_cat'] ) )
            $category = get_cat_ID( esc_attr( $_GET['post_cat'] ) );

        return $category;
    }

}
add_action( 'load-post-new.php', array( 'Set_Default_Cat_From_Url_Param', 'init' ) );

0

我知道已经解决了这个问题,但是我想补充一点。我在这里将其添加到要点中https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451bd857

但是,为节省您的麻烦,下面是代码:

function set_category () {

    global $post;
  //Check for a category parameter in our URL, and sanitize it as a string
    $category_slug = filter_input(INPUT_GET, 'category', FILTER_SANITIZE_STRING, array("options" => array("default" => 0)));

  //If we've got a category by that name, set the post terms for it
    if ( $category = get_category_by_slug($category_slug) ) {
        wp_set_post_terms( $post->ID, array($category->term_id), 'category' );
    }

}

//hook it into our post-new.php specific action hook
add_action( 'admin_head-post-new.php', 'set_category', 10, 1 );

与所有其他类似,您可以通过/wp-admin/post-new.php?category=categoryname触发它

仅供参考,如果您使用的是高级自定义字段(例如@Aphire),则可以使用。


如果这是一个简单的帖子,这将起作用。如果有post_type参数,则它不起作用。我如何解决此问题以识别wp-admin / post-new.php?post_type = wpdmpro?category = mycategory
yurividal

@yurividal不幸的是,目前我还没有建立环境,我的记忆很朦胧,但是快速浏览WordPress Download Manager代码看起来像是问题在于它使用的是“看起来”类似的自定义分类法内置的类别分类法,但不是。
Malcalevak

@yurividal并非要结束评论。您可能需要将get_category_by_slug函数调整为get_term_by,然后调整wp_set_post_terms来设置自定义wpdmcategory分类法。
Malcalevak '19

哇,听起来有点复杂,我认为我没有足够的PHP技能。无论如何,谢谢您的帮助,我将尝试更深入地研究。
yurividal

@yurividal我不认为这会那么复杂,但是我绝对可以认为这对以PHP和/或WordPress进行的较不完善的启动是令人生畏的。如果我有时间闲暇,我会尝试将一些东西放在一起,我唯一担心的是我目前无法对其进行测试,这会使诊断问题变得有点复杂。
马尔卡列瓦克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.