From 8a8ac376bf50765f989182f702495cfe2826f9c5 Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 18 Dec 2008 19:12:26 +0000 Subject: [PATCH] Allow muliple tag-like taxonomies in the post editor. see #6387 git-svn-id: http://svn.automattic.com/wordpress/trunk@10222 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/admin-ajax.php | 17 +++- wp-admin/css/colors-classic.css | 6 +- wp-admin/css/colors-fresh.css | 6 +- wp-admin/css/ie-rtl.css | 2 +- wp-admin/css/ie.css | 6 +- wp-admin/edit-form-advanced.php | 36 ++++++- wp-admin/includes/taxonomy.php | 42 ++++++-- wp-admin/includes/template.php | 5 +- wp-admin/js/post.js | 166 ++++++++++++++++++++------------ wp-admin/rtl.css | 10 +- wp-admin/wp-admin.css | 16 +-- wp-includes/js/autosave.js | 6 +- wp-includes/post.php | 53 +++++++++- wp-includes/script-loader.php | 4 +- wp-includes/taxonomy.php | 4 +- 15 files changed, 265 insertions(+), 114 deletions(-) diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php index 77eb68b91b..f5e13f1b0a 100644 --- a/wp-admin/admin-ajax.php +++ b/wp-admin/admin-ajax.php @@ -44,6 +44,11 @@ case 'ajax-tag-search' : die('-1'); $s = $_GET['q']; // is this slashed already? + + if ( isset($_GET['tax']) ) + $taxonomy = sanitize_title($_GET['tax']); + else + die('0'); if ( false !== strpos( $s, ',' ) ) { $s = explode( ',', $s ); @@ -52,7 +57,9 @@ case 'ajax-tag-search' : $s = trim( $s ); if ( strlen( $s ) < 2 ) die; // require 2 chars for matching - $results = $wpdb->get_col( "SELECT t.name FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = 'post_tag' AND t.name LIKE ('%". $s . "%')" ); + + $results = $wpdb->get_col( "SELECT t.name FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = '$taxonomy' AND t.name LIKE ('%" . $s . "%')" ); + echo join( $results, "\n" ); die; break; @@ -490,7 +497,12 @@ case 'get-tagcloud' : if ( !current_user_can( 'manage_categories' ) ) die('-1'); - $tags = get_tags( array( 'number' => 45, 'orderby' => 'count', 'order' => 'DESC' ) ); + if ( isset($_POST['tax']) ) + $taxonomy = sanitize_title($_POST['tax']); + else + die('0'); + + $tags = get_terms( $taxonomy, array( 'number' => 45, 'orderby' => 'count', 'order' => 'DESC' ) ); if ( empty( $tags ) ) die( __('No tags found!') ); @@ -776,7 +788,6 @@ case 'autosave' : // The name of this action is hardcoded in edit_post() global $current_user; $_POST['post_category'] = explode(",", $_POST['catslist']); - $_POST['tags_input'] = explode(",", $_POST['tags_input']); if($_POST['post_type'] == 'page' || empty($_POST['post_category'])) unset($_POST['post_category']); diff --git a/wp-admin/css/colors-classic.css b/wp-admin/css/colors-classic.css index a57ed8ec9d..9925989298 100644 --- a/wp-admin/css/colors-classic.css +++ b/wp-admin/css/colors-classic.css @@ -682,12 +682,12 @@ li.widget-list-control-item h4, color: #448abd; } -#tagchecklist span a, +.tagchecklist span a, #bulk-titles div a { background: url(../images/xit.gif) no-repeat; } -#tagchecklist span a:hover, +.tagchecklist span a:hover, #bulk-titles div a:hover { background: url(../images/xit.gif) no-repeat -10px 0; } @@ -1007,7 +1007,7 @@ abbr.required, #timestampdiv input, #namediv input, -#tagsdiv #the-tagcloud { +#poststuff .inside .the-tagcloud { border-color: #ddd; } diff --git a/wp-admin/css/colors-fresh.css b/wp-admin/css/colors-fresh.css index 73050191bb..4960aa1fb6 100644 --- a/wp-admin/css/colors-fresh.css +++ b/wp-admin/css/colors-fresh.css @@ -682,12 +682,12 @@ li.widget-list-control-item h4, color: #448abd; } -#tagchecklist span a, +.tagchecklist span a, #bulk-titles div a { background: url(../images/xit.gif) no-repeat; } -#tagchecklist span a:hover, +.tagchecklist span a:hover, #bulk-titles div a:hover { background: url(../images/xit.gif) no-repeat -10px 0; } @@ -1007,7 +1007,7 @@ abbr.required, #timestampdiv input, #namediv input, -#tagsdiv #the-tagcloud { +#poststuff .inside .the-tagcloud { border-color: #ddd; } diff --git a/wp-admin/css/ie-rtl.css b/wp-admin/css/ie-rtl.css index f66409e1d2..1a6db4867f 100644 --- a/wp-admin/css/ie-rtl.css +++ b/wp-admin/css/ie-rtl.css @@ -44,7 +44,7 @@ div#dashboard-widgets { padding-right: 0; padding-left: 1px; } -#tagchecklist span a { +.tagchecklist span a { margin: 4px -9px 0 0; } .widefat th input { diff --git a/wp-admin/css/ie.css b/wp-admin/css/ie.css index 29181ec7a1..f472e623a2 100644 --- a/wp-admin/css/ie.css +++ b/wp-admin/css/ie.css @@ -245,7 +245,7 @@ li.widget-list-control-item, li.widget-list-control-item h4, .widget-sortable, .widget-control-actions, -#tagchecklist, +.tagchecklist, #col-container, #col-left, #col-right { @@ -296,12 +296,12 @@ div#dashboard-widgets { padding-right: 1px; } -#tagchecklist span, #tagchecklist span a { +.tagchecklist span, .tagchecklist span a { display: inline-block; display: block; } -#tagchecklist span a { +.tagchecklist span a { margin: 4px 0 0 -9px; } diff --git a/wp-admin/edit-form-advanced.php b/wp-admin/edit-form-advanced.php index 904b9831c5..522f8d384c 100644 --- a/wp-admin/edit-form-advanced.php +++ b/wp-admin/edit-form-advanced.php @@ -263,14 +263,40 @@ add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', 'post', 'side', * * @param object $post */ -function post_tags_meta_box($post) { +function post_tags_meta_box($post, $box) { + $tax_name = substr($box['id'], 8); + $taxonomy = get_taxonomy($tax_name); + if ( isset($taxonomy->helps) ) + $helps = attribute_escape($taxonomy->helps); + else + $helps = ''; ?> -

-
- +
+

+ + " class="the-tags" id="tax-input[]" value="ID, $tax_name ); ?>" /> + + + $helps

" : ''; ?> +

+
+ + label) ? attribute_escape($taxonomy->label) : $tax_name; + + add_meta_box('tagsdiv-' . $tax_name, $label, 'post_tags_meta_box', 'post', 'side', 'core'); + } +} /** * Display post categories form fields. diff --git a/wp-admin/includes/taxonomy.php b/wp-admin/includes/taxonomy.php index a6c753d48b..9fdd8b3617 100644 --- a/wp-admin/includes/taxonomy.php +++ b/wp-admin/includes/taxonomy.php @@ -194,21 +194,37 @@ function wp_update_category($catarr) { * @param unknown_type $post_id * @return unknown */ -function get_tags_to_edit( $post_id ) { +function get_tags_to_edit( $post_id, $taxonomy = 'post_tag' ) { + return get_terms_to_edit( $post_id, $taxonomy); +} + +/** + * {@internal Missing Short Description}} + * + * @since unknown + * + * @param unknown_type $post_id + * @return unknown + */ +function get_terms_to_edit( $post_id, $taxonomy = 'post_tag' ) { $post_id = (int) $post_id; if ( !$post_id ) return false; - $tags = wp_get_post_tags($post_id); + $tags = wp_get_post_terms($post_id, $taxonomy, array()); if ( !$tags ) return false; + if ( is_wp_error($tags) ) + return $tags; + foreach ( $tags as $tag ) $tag_names[] = $tag->name; $tags_to_edit = join( ',', $tag_names ); $tags_to_edit = attribute_escape( $tags_to_edit ); - $tags_to_edit = apply_filters( 'tags_to_edit', $tags_to_edit ); + $tags_to_edit = apply_filters( 'terms_to_edit', $tags_to_edit, $taxonomy ); + return $tags_to_edit; } @@ -233,10 +249,20 @@ function tag_exists($tag_name) { * @return unknown */ function wp_create_tag($tag_name) { - if ( $id = tag_exists($tag_name) ) - return $id; - - return wp_insert_term($tag_name, 'post_tag'); + return wp_create_term( $tag_name, 'post_tag'); } -?> +/** + * {@internal Missing Short Description}} + * + * @since unknown + * + * @param unknown_type $tag_name + * @return unknown + */ +function wp_create_term($tag_name, $taxonomy = 'post_tag') { + if ( $id = is_term($tag_name, $taxonomy) ) + return $id; + + return wp_insert_term($tag_name, $taxonomy); +} diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php index 5f7764f2d3..84aecd01a3 100644 --- a/wp-admin/includes/template.php +++ b/wp-admin/includes/template.php @@ -2695,7 +2695,7 @@ function wp_remember_old_slug() { * @param string $context The context within the page where the boxes should show ('normal', 'advanced'). * @param string $priority The priority within the context where the boxes should show ('high', 'low'). */ -function add_meta_box($id, $title, $callback, $page, $context = 'advanced', $priority = 'default') { +function add_meta_box($id, $title, $callback, $page, $context = 'advanced', $priority = 'default', $callback_args=null) { global $wp_meta_boxes; if ( !isset($wp_meta_boxes) ) @@ -2729,6 +2729,7 @@ function add_meta_box($id, $title, $callback, $page, $context = 'advanced', $pri } elseif ( 'sorted' == $priority ) { $title = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['title']; $callback = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['callback']; + $callback_args = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['args']; } // An id can be in only one priority and one context if ( $priority != $a_priority || $context != $a_context ) @@ -2742,7 +2743,7 @@ function add_meta_box($id, $title, $callback, $page, $context = 'advanced', $pri if ( !isset($wp_meta_boxes[$page][$context][$priority]) ) $wp_meta_boxes[$page][$context][$priority] = array(); - $wp_meta_boxes[$page][$context][$priority][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback); + $wp_meta_boxes[$page][$context][$priority][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $callback_args); } /** diff --git a/wp-admin/js/post.js b/wp-admin/js/post.js index eb9ae4372b..40a0892a33 100644 --- a/wp-admin/js/post.js +++ b/wp-admin/js/post.js @@ -1,95 +1,146 @@ // this file contains all the scripts used in the post/edit page +// return an array with any duplicate, whitespace or values removed +function array_unique_noempty(a) { + var out = []; + jQuery.each( a, function(key, val) { + val = jQuery.trim(val); + if ( val && jQuery.inArray(val, out) == -1 ) + out.push(val); + } ); + return out; +} + function new_tag_remove_tag() { var id = jQuery( this ).attr( 'id' ); - var num = id.substr( 10 ); - var current_tags = jQuery( '#tags-input' ).val().split(','); + var num = id.split('-check-num-')[1]; + var taxbox = jQuery(this).parents('.tagsdiv'); + var current_tags = taxbox.find( '.the-tags' ).val().split(','); delete current_tags[num]; var new_tags = []; - jQuery.each( current_tags, function( key, val ) { - if ( val && !val.match(/^\s+$/) && '' != val ) { - new_tags = new_tags.concat( val ); + + jQuery.each( current_tags, function(key, val) { + val = jQuery.trim(val); + if ( val ) { + new_tags.push(val); } }); - jQuery( '#tags-input' ).val( new_tags.join( ',' ).replace( /\s*,+\s*/, ',' ).replace( /,+/, ',' ).replace( /,+\s+,+/, ',' ).replace( /,+\s*$/, '' ).replace( /^\s*,+/, '' ) ); - tag_update_quickclicks(); - jQuery('#newtag').focus(); + + taxbox.find('.the-tags').val( new_tags.join(',').replace(/\s*,+\s*/, ',').replace(/,+/, ',').replace(/,+\s+,+/, ',').replace(/,+\s*$/, '').replace(/^\s*,+/, '') ); + + tag_update_quickclicks(taxbox); return false; } -function tag_update_quickclicks() { - if ( jQuery( '#tags-input' ).length == 0 ) +function tag_update_quickclicks(taxbox) { + if ( jQuery(taxbox).find('.the-tags').length == 0 ) return; - var current_tags = jQuery( '#tags-input' ).val().split(','); - jQuery( '#tagchecklist' ).empty(); + + var current_tags = jQuery(taxbox).find('.the-tags').val().split(','); + jQuery(taxbox).find('.tagchecklist').empty(); shown = false; -// jQuery.merge( current_tags, current_tags ); // this doesn't work anymore, need something to array_unique + jQuery.each( current_tags, function( key, val ) { - val = val.replace( /^\s+/, '' ).replace( /\s+$/, '' ); // trim + val = jQuery.trim(val); if ( !val.match(/^\s+$/) && '' != val ) { - txt = 'X ' + val + ' '; - jQuery( '#tagchecklist' ).append( txt ); - jQuery( '#tag-check-' + key ).click( new_tag_remove_tag ); - shown = true; + var button_id = jQuery(taxbox).attr('id') + '-check-num-' + key; + txt = 'X ' + val + ' '; + jQuery(taxbox).find('.tagchecklist').append(txt); + jQuery( '#' + button_id ).click( new_tag_remove_tag ); } }); if ( shown ) - jQuery( '#tagchecklist' ).prepend( ''+postL10n.tagsUsed+'
' ); + jQuery(taxbox).find('.tagchecklist').prepend(''+postL10n.tagsUsed+'
'); } -function tag_flush_to_text(e,a) { +function tag_flush_to_text(id, a) { a = a || false; - var text = a ? jQuery(a).text() : jQuery('#newtag').val(); - var newtags = jQuery('#tags-input').val(); + var taxbox = jQuery('#'+id); + var text = a ? jQuery(a).text() : taxbox.find('input.newtag').val(); - var t = text.replace( /\s*([^,]+).*/, '$1,' ); - newtags += ',' - - if ( newtags.indexOf(t) != -1 ) + // is the input box empty (i.e. showing the 'Add new tag' tip)? + if ( taxbox.find('input.newtag').hasClass('form-input-tip') && ! a ) return false; - newtags += text; + var tags = taxbox.find('.the-tags').val(); + var newtags = tags ? tags + ',' + text : text; // massage - newtags = newtags.replace( /\s+,+\s*/g, ',' ).replace( /,+/g, ',' ).replace( /,+\s+,+/g, ',' ).replace( /,+\s*$/g, '' ).replace( /^\s*,+/g, '' ); - jQuery('#tags-input').val( newtags ); - tag_update_quickclicks(); - if ( ! a ) { - jQuery('#newtag').val(''); - jQuery('#newtag').focus(); - } + newtags = newtags.replace(/\s+,+\s*/g, ',').replace(/,+/g, ',').replace(/,+\s+,+/g, ',').replace(/,+\s*$/g, '').replace(/^\s*,+/g, ''); + newtags = array_unique_noempty(newtags.split(',')).join(','); + taxbox.find('.the-tags').val(newtags); + tag_update_quickclicks(taxbox); + + if ( ! a ) + taxbox.find('input.newtag').val('').focus(); + return false; } function tag_save_on_publish() { - if ( jQuery('#newtag').val() != postL10n.addTag ) - tag_flush_to_text(); + jQuery('.tagsdiv').each( function(i) { + if ( !jQuery(this).find('input.newtag').hasClass('form-input-tip') ) + tag_flush_to_text(jQuery(this).parents('.tagsdiv').attr('id')); + } ); } function tag_press_key( e ) { - if ( 13 == e.keyCode ) { - tag_flush_to_text(); + if ( 13 == e.which ) { + tag_flush_to_text(jQuery(e.target).parents('.tagsdiv').attr('id')); return false; } }; +function tag_init() { + + jQuery('.ajaxtag').show(); + jQuery('.tagsdiv').each( function(i) { + tag_update_quickclicks(this); + } ); + + // add the quickadd form + jQuery('.ajaxtag input.tagadd').click(function(){tag_flush_to_text(jQuery(this).parents('.tagsdiv').attr('id'));}); + jQuery('.ajaxtag input.newtag').focus(function() { + if ( this.value == postL10n.addTag ) { + jQuery(this).val( '' ).removeClass( 'form-input-tip' ); + } + }); + + jQuery('.ajaxtag input.newtag').blur(function() { + if ( this.value == '' ) { + jQuery(this).val( postL10n.addTag ).addClass( 'form-input-tip' ); + } + }); + + // auto-save tags on post save/publish + jQuery('#publish').click( tag_save_on_publish ); + jQuery('#save-post').click( tag_save_on_publish ); + + // catch the enter key + jQuery('.ajaxtag input.newtag').keypress( tag_press_key ); +} + (function($){ tagCloud = { init : function() { - $('#tagcloud-link').click(function(){tagCloud.get(); $(this).unbind().click(function(){return false;}); return false;}); + $('.tagcloud-link').click(function(){tagCloud.get($(this).attr('id')); $(this).unbind().click(function(){return false;}); return false;}); }, - get : function() { - $.post('admin-ajax.php', {'action':'get-tagcloud'}, function(r, stat) { + get : function(id) { + tax = id.substr(id.indexOf('-')+1); + + $.post('admin-ajax.php', {'action':'get-tagcloud','tax':tax}, function(r, stat) { if ( 0 == r || 'success' != stat ) r = wpAjax.broken; - r = '

'+r+'

'; - $('#tagcloud-link').after($(r)); - $('#the-tagcloud a').click(function(){ - tag_flush_to_text(0,this); + r = $('

'+r+'

'); + $('a', r).click(function(){ + var id = $(this).parents('p').attr('id'); + tag_flush_to_text(id.substr(id.indexOf('-')+1), this); return false; }); + + $('#'+id).after(r); }); } } @@ -107,29 +158,16 @@ jQuery(document).ready( function($) { // Editable slugs make_slugedit_clickable(); - jQuery('#tags-input').hide(); - tag_update_quickclicks(); - // add the quickadd form - jQuery('#jaxtag').prepend(''+postL10n.separate+''); - jQuery('#tagadd').click( tag_flush_to_text ); - jQuery('#newtag').focus(function() { - if ( this.value == postL10n.addTag ) - jQuery(this).val( '' ).removeClass( 'form-input-tip' ); - }); - jQuery('#newtag').blur(function() { - if ( this.value == '' ) - jQuery(this).val( postL10n.addTag ).addClass( 'form-input-tip' ); - }); - - // auto-save tags on post save/publish - jQuery('#publish').click( tag_save_on_publish ); - jQuery('#save-post').click( tag_save_on_publish ); + // prepare the tag UI + tag_init(); jQuery('#title').blur( function() { if ( (jQuery("#post_ID").val() > 0) || (jQuery("#title").val().length == 0) ) return; autosave(); } ); // auto-suggest stuff - jQuery('#newtag').suggest( 'admin-ajax.php?action=ajax-tag-search', { delay: 500, minchars: 2, multiple: true, multipleSep: ", " } ); - jQuery('#newtag').keypress( tag_press_key ); + jQuery('.newtag').each(function(){ + var tax = $(this).parents('div.tagsdiv').attr('id'); + $(this).suggest( 'admin-ajax.php?action=ajax-tag-search&tax='+tax, { delay: 500, minchars: 2, multiple: true, multipleSep: ", " } ); + }); // category tabs var categoryTabs =jQuery('#category-tabs').tabs(); diff --git a/wp-admin/rtl.css b/wp-admin/rtl.css index 467711aa45..4ca218c89e 100644 --- a/wp-admin/rtl.css +++ b/wp-admin/rtl.css @@ -211,7 +211,7 @@ td.available-theme { #normal-sortables .postbox .submit { float: left; } -#post-body #tagsdiv #newtag { +#post-body .tagsdiv #newtag { margin-right: 0; margin-left: 5px; } @@ -221,18 +221,18 @@ td.available-theme { #comment-status-radio input { margin: 2px 0 5px 3px; } -#tagchecklist { +.tagchecklist { margin-left: 0; margin-right: 10px; } -#tagchecklist strong { +.tagchecklist strong { margin-left: 0; margin-right: -8px; } -#tagchecklist span { +.tagchecklist span { float: right; } -#tagchecklist span a { +.tagchecklist span a { margin: 6px -9px 0 0; float: right; } diff --git a/wp-admin/wp-admin.css b/wp-admin/wp-admin.css index accd673084..a97d73dea0 100644 --- a/wp-admin/wp-admin.css +++ b/wp-admin/wp-admin.css @@ -1355,7 +1355,7 @@ table.form-table td .updated { display: none; } -#post-body #tagsdiv #newtag { +#post-body .tagsdiv #newtag { margin-right: 5px; width: 16em; } @@ -1364,7 +1364,7 @@ table.form-table td .updated { width: 94% } -#side-info-column #tagsdiv #newtag { +#side-info-column .tagsdiv #newtag { width: 68%; } @@ -1421,18 +1421,18 @@ table.form-table td .updated { padding: 5px 0; } -#tagchecklist { +.tagchecklist { margin-left: 10px; font-size: 12px; overflow: auto; } -#tagchecklist strong { +.tagchecklist strong { margin-left: -8px; position: absolute; } -#tagchecklist span { +.tagchecklist span { margin-right: 25px; display: block; float: left; @@ -1442,7 +1442,7 @@ table.form-table td .updated { cursor: default; } -#tagchecklist span a { +.tagchecklist span a { margin: 6px 0pt 0pt -9px; cursor: pointer; width: 10px; @@ -2830,8 +2830,8 @@ form.upgrade { margin-top: 8px; } -#tagsdiv #the-tagcloud { - margin: 5px 5px 10px; +#poststuff .inside .the-tagcloud { + margin: 5px 0 10px; padding: 8px; border-width: 1px; border-style: solid; diff --git a/wp-includes/js/autosave.js b/wp-includes/js/autosave.js index 8459bc50c3..75b4e88c08 100644 --- a/wp-includes/js/autosave.js +++ b/wp-includes/js/autosave.js @@ -130,10 +130,14 @@ var autosave = function() { post_ID: jQuery("#post_ID").val() || 0, post_title: jQuery("#title").val() || "", autosavenonce: jQuery('#autosavenonce').val(), - tags_input: jQuery("#tags-input").val() || "", + //tags_input: jQuery("#tags-input").val() || "", post_type: jQuery('#post_type').val() || "", autosave: 1 }; + + jQuery('.tags-input').each( function() { + post_data[this.name] = this.value; + } ); // We always send the ajax request in order to keep the post lock fresh. // This (bool) tells whether or not to write the post to the DB during the ajax request. diff --git a/wp-includes/post.php b/wp-includes/post.php index d39bf855c5..7cf1832816 100644 --- a/wp-includes/post.php +++ b/wp-includes/post.php @@ -1206,12 +1206,34 @@ function wp_get_post_categories( $post_id = 0, $args = array() ) { * @return array List of post tags. */ function wp_get_post_tags( $post_id = 0, $args = array() ) { + return wp_get_post_terms( $post_id, 'post_tag', $args); +} + +/** + * Retrieve the terms for a post. + * + * There is only one default for this function, called 'fields' and by default + * is set to 'all'. There are other defaults that can be override in + * {@link wp_get_object_terms()}. + * + * @package WordPress + * @subpackage Post + * @since 2.8.0 + * + * @uses wp_get_object_terms() Gets the tags for returning. Args can be found here + * + * @param int $post_id Optional. The Post ID + * @param string $taxonomy The taxonomy for which to retrieve terms. Defaults to post_tag. + * @param array $args Optional. Overwrite the defaults + * @return array List of post tags. + */ +function wp_get_post_terms( $post_id = 0, $taxonomy = 'post_tag', $args = array() ) { $post_id = (int) $post_id; $defaults = array('fields' => 'all'); $args = wp_parse_args( $args, $defaults ); - $tags = wp_get_object_terms($post_id, 'post_tag', $args); + $tags = wp_get_object_terms($post_id, $taxonomy, $args); return $tags; } @@ -1498,7 +1520,15 @@ function wp_insert_post($postarr = array(), $wp_error = false) { } wp_set_post_categories( $post_ID, $post_category ); - wp_set_post_tags( $post_ID, $tags_input ); + // old-style tags_input + if ( !empty($tags_input) ) + wp_set_post_tags( $post_ID, $tags_input ); + // new-style support for all tag-like taxonomies + if ( !empty($tax_input) ) { + foreach ( $tax_input as $taxonomy => $tags ) { + wp_set_post_terms( $post_ID, $tags, $taxonomy ); + } + } $current_guid = get_post_field( 'guid', $post_ID ); @@ -1685,7 +1715,21 @@ function wp_add_post_tags($post_id = 0, $tags = '') { * @return bool|null Will return false if $post_id is not an integer or is 0. Will return null otherwise */ function wp_set_post_tags( $post_id = 0, $tags = '', $append = false ) { + return wp_set_post_terms( $post_id, $tags, 'post_tag', $append); +} +/** + * Set the terms for a post. + * + * @since 2.8.0 + * @uses wp_set_object_terms() Sets the tags for the post. + * + * @param int $post_id Post ID. + * @param string $tags The tags to set for the post, separated by commas. + * @param bool $append If true, don't delete existing tags, just add on. If false, replace the tags with the new tags. + * @return bool|null Will return false if $post_id is not an integer or is 0. Will return null otherwise + */ +function wp_set_post_terms( $post_id = 0, $tags = '', $taxonomy = 'post_tag', $append = false ) { $post_id = (int) $post_id; if ( !$post_id ) @@ -1693,8 +1737,9 @@ function wp_set_post_tags( $post_id = 0, $tags = '', $append = false ) { if ( empty($tags) ) $tags = array(); - $tags = (is_array($tags)) ? $tags : explode( ',', trim($tags, " \n\t\r\0\x0B,") ); - wp_set_object_terms($post_id, $tags, 'post_tag', $append); + + $tags = is_array($tags) ? $tags : explode( ',', trim($tags, " \n\t\r\0\x0B,") ); + wp_set_object_terms($post_id, $tags, $taxonomy, $append); } /** diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index 370c2064c6..c4ee380b7d 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -77,7 +77,7 @@ function wp_default_scripts( &$scripts ) { 'l10n_print_after' => 'try{convertEntities(wpAjax);}catch(e){};' ) ); - $scripts->add( 'autosave', '/wp-includes/js/autosave.js', array('schedule', 'wp-ajax-response'), '20081210' ); + $scripts->add( 'autosave', '/wp-includes/js/autosave.js', array('schedule', 'wp-ajax-response'), '20081217' ); $scripts->add( 'wp-lists', '/wp-includes/js/wp-lists.js', array('wp-ajax-response'), '20081210' ); $scripts->localize( 'wp-lists', 'wpListL10n', array( @@ -179,7 +179,7 @@ function wp_default_scripts( &$scripts ) { 'cancel' => __('Cancel'), 'l10n_print_after' => 'try{convertEntities(slugL10n);}catch(e){};' ) ); - $scripts->add( 'post', '/wp-admin/js/post.js', array('suggest', 'jquery-ui-tabs', 'wp-lists', 'postbox', 'slug'), '20081210' ); + $scripts->add( 'post', '/wp-admin/js/post.js', array('suggest', 'jquery-ui-tabs', 'wp-lists', 'postbox', 'slug'), '20081217' ); $scripts->localize( 'post', 'postL10n', array( 'tagsUsed' => __('Tags used on this post:'), 'add' => attribute_escape(__('Add')), diff --git a/wp-includes/taxonomy.php b/wp-includes/taxonomy.php index abc0c3fea1..d0b644e55b 100644 --- a/wp-includes/taxonomy.php +++ b/wp-includes/taxonomy.php @@ -17,8 +17,8 @@ * @global array $wp_taxonomies */ $wp_taxonomies = array(); -$wp_taxonomies['category'] = (object) array('name' => 'category', 'object_type' => 'post', 'hierarchical' => true, 'update_count_callback' => '_update_post_term_count'); -$wp_taxonomies['post_tag'] = (object) array('name' => 'post_tag', 'object_type' => 'post', 'hierarchical' => false, 'update_count_callback' => '_update_post_term_count'); +$wp_taxonomies['category'] = (object) array('name' => 'category', 'object_type' => 'post', 'hierarchical' => true, 'update_count_callback' => '_update_post_term_count', 'label' => __('Categories')); +$wp_taxonomies['post_tag'] = (object) array('name' => 'post_tag', 'object_type' => 'post', 'hierarchical' => false, 'update_count_callback' => '_update_post_term_count', 'label' => __('Post Tags')); $wp_taxonomies['link_category'] = (object) array('name' => 'link_category', 'object_type' => 'link', 'hierarchical' => false); /**