WordPress.org

Make WordPress Core

Ticket #36514: 36514.3.diff

File 36514.3.diff, 5.8 KB (added by boonebgorges, 3 years ago)
  • src/wp-admin/includes/post.php

    diff --git src/wp-admin/includes/post.php src/wp-admin/includes/post.php
    index c352cbc..1c217a0 100644
    function edit_post( $post_data = null ) { 
    326326        // Convert taxonomy input to term IDs, to avoid ambiguity.
    327327        if ( isset( $post_data['tax_input'] ) ) {
    328328                foreach ( (array) $post_data['tax_input'] as $taxonomy => $terms ) {
    329                         // Hierarchical taxonomy data is already sent as term IDs, so no conversion is necessary.
    330                         if ( is_taxonomy_hierarchical( $taxonomy ) ) {
    331                                 continue;
    332                         }
    333 
    334                         /*
    335                          * Assume that a 'tax_input' string is a comma-separated list of term names.
    336                          * Some languages may use a character other than a comma as a delimiter, so we standardize on
    337                          * commas before parsing the list.
    338                          */
    339                         if ( ! is_array( $terms ) ) {
    340                                 $comma = _x( ',', 'tag delimiter' );
    341                                 if ( ',' !== $comma ) {
    342                                         $terms = str_replace( $comma, ',', $terms );
    343                                 }
    344                                 $terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) );
    345                         }
    346 
    347                         $clean_terms = array();
    348                         foreach ( $terms as $term ) {
    349                                 // Empty terms are invalid input.
    350                                 if ( empty( $term ) ) {
    351                                         continue;
    352                                 }
     329                        $tax_object = get_taxonomy( $taxonomy );
    353330
    354                                 $_term = get_terms( $taxonomy, array(
    355                                         'name' => $term,
    356                                         'fields' => 'ids',
    357                                         'hide_empty' => false,
    358                                 ) );
    359 
    360                                 if ( ! empty( $_term ) ) {
    361                                         $clean_terms[] = intval( $_term[0] );
    362                                 } else {
    363                                         // No existing term was found, so pass the string. A new term will be created.
    364                                         $clean_terms[] = $term;
    365                                 }
     331                        if ( $tax_object && isset( $tax_object->meta_box_sanitize_cb ) ) {
     332                                $post_data['tax_input'][ $taxonomy ] = call_user_func_array( $tax_object->meta_box_sanitize_cb, array( $taxonomy, $terms ) );
    366333                        }
    367 
    368                         $post_data['tax_input'][ $taxonomy ] = $clean_terms;
    369334                }
    370335        }
    371336
    function redirect_post($post_id = '') { 
    18791844        wp_redirect( apply_filters( 'redirect_post_location', $location, $post_id ) );
    18801845        exit;
    18811846}
     1847
     1848/**
     1849 * Sanitizes POST values from a checkbox taxonomy metabox.
     1850 *
     1851 * @since 4.7.0
     1852 *
     1853 * @param mixed $terms Raw term data from the 'tax_input' field.
     1854 * @return array
     1855 */
     1856function taxonomy_meta_box_sanitize_cb_checkboxes( $taxonmy, $terms ) {
     1857        return array_map( 'intval', $terms );
     1858}
     1859
     1860/**
     1861 * Sanitizes POST values from an input taxonomy metabox.
     1862 *
     1863 * @since 4.7.0
     1864 *
     1865 * @param mixed $terms Raw term data from the 'tax_input' field.
     1866 * @return array
     1867 */
     1868function taxonomy_meta_box_sanitize_cb_input( $taxonomy, $terms ) {
     1869        /*
     1870         * Assume that a 'tax_input' string is a comma-separated list of term names.
     1871         * Some languages may use a character other than a comma as a delimiter, so we standardize on
     1872         * commas before parsing the list.
     1873         */
     1874        if ( ! is_array( $terms ) ) {
     1875                $comma = _x( ',', 'tag delimiter' );
     1876                if ( ',' !== $comma ) {
     1877                        $terms = str_replace( $comma, ',', $terms );
     1878                }
     1879                $terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) );
     1880        }
     1881
     1882        $clean_terms = array();
     1883        foreach ( $terms as $term ) {
     1884                // Empty terms are invalid input.
     1885                if ( empty( $term ) ) {
     1886                        continue;
     1887                }
     1888
     1889                $_term = get_terms( $taxonomy, array(
     1890                        'name' => $term,
     1891                        'fields' => 'ids',
     1892                        'hide_empty' => false,
     1893                ) );
     1894
     1895                if ( ! empty( $_term ) ) {
     1896                        $clean_terms[] = intval( $_term[0] );
     1897                } else {
     1898                        // No existing term was found, so pass the string. A new term will be created.
     1899                        $clean_terms[] = $term;
     1900                }
     1901        }
     1902
     1903        return $clean_terms;
     1904}
  • src/wp-includes/class-wp-taxonomy.php

    diff --git src/wp-includes/class-wp-taxonomy.php src/wp-includes/class-wp-taxonomy.php
    index 4611ce9..2e14539 100644
    final class WP_Taxonomy { 
    142142        public $meta_box_cb = null;
    143143
    144144        /**
     145         * The callback function for sanitizing taxonomy data saved from a meta box.
     146         *
     147         * @since 4.7.0
     148         * @access public
     149         * @var callable
     150         */
     151        public $meta_box_sanitize_cb = null;
     152
     153        /**
    145154         * An array of object types this taxonomy is registered for.
    146155         *
    147156         * @since 4.7.0
    final class WP_Taxonomy { 
    250259                        'show_in_quick_edit'    => null,
    251260                        'show_admin_column'     => false,
    252261                        'meta_box_cb'           => null,
     262                        'meta_box_sanitize_cb'  => null,
    253263                        'capabilities'          => array(),
    254264                        'rewrite'               => true,
    255265                        'query_var'             => $this->name,
    final class WP_Taxonomy { 
    333343                        }
    334344                }
    335345
     346                // Default meta box sanitization callback depends on the value of 'meta_box_cb'.
     347                if ( null === $args['meta_box_sanitize_cb'] ) {
     348                        switch ( $args['meta_box_cb'] ) {
     349                                case 'post_categories_meta_box' :
     350                                        $args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_checkboxes';
     351                                break;
     352
     353                                case 'post_tags_meta_box' :
     354                                default :
     355                                        $args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_input';
     356                                break;
     357                        }
     358                }
     359
    336360                foreach ( $args as $property_name => $property_value ) {
    337361                        $this->$property_name = $property_value;
    338362                }
  • src/wp-includes/taxonomy.php

    diff --git src/wp-includes/taxonomy.php src/wp-includes/taxonomy.php
    index 4af42cd..5f4ec14 100644
    function is_taxonomy_hierarchical($taxonomy) { 
    333333 *                                                post_categories_meta_box() is used for hierarchical taxonomies, and
    334334 *                                                post_tags_meta_box() is used for non-hierarchical. If false, no meta
    335335 *                                                box is shown.
     336 *     @type callable      $meta_box_sanitize_cb  Callback function for sanitizing taxonomy data saved from a meta
     337 *                                                box. If no callback is defined, an appropriate one is determined
     338 *                                                based on the value of `$meta_box_cb`.
    336339 *     @type array         $capabilities {
    337340 *         Array of capabilities for this taxonomy.
    338341 *