问题描述
我想有一个链接来创建一个新的职位,也设置类别。
我试过 wp-admin/post-new.php?post_category=12
和 wp-admin/post-new.php?cat=12
,但都没有工作。我也尝试使用该名称而不是该类别的 id; 这也没有影响。
如何创建一个默认类别的新帖子的链接?
最佳解决方案
GitHub 上的戴维·詹姆斯·米勒 (Dave James Miller) 为我定了一个。没有一个工作来自我,我只是把他的代码包装成一个 plguin,因为它的广告效果完美:
<?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, " ntrx0B,") );
$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);
次佳解决方案
钩入 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'] ) );
}
现在 auto-draft 处理程序:
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
传递一个逗号分隔的类别 lug separated 列表:
也可以看看:
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。