WordPress.org

Make WordPress Core

Ticket #36514: 36514.2.diff

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

    diff --git a/src/wp-admin/includes/post.php b/src/wp-admin/includes/post.php
    index b12aa5d..b9fae9a 100644
    a b 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 = '') { 
    18751840        wp_redirect( apply_filters( 'redirect_post_location', $location, $post_id ) );
    18761841        exit;
    18771842}
     1843
     1844/**
     1845 * Sanitizes POST values from a checkbox taxonomy metabox.
     1846 *
     1847 * @since 4.7.0
     1848 *
     1849 * @param mixed $terms Raw term data from the 'tax_input' field.
     1850 * @return array
     1851 */
     1852function taxonomy_meta_box_sanitize_cb_checkboxes( $taxonmy, $terms ) {
     1853        return array_map( 'intval', $terms );
     1854}
     1855
     1856/**
     1857 * Sanitizes POST values from an input taxonomy metabox.
     1858 *
     1859 * @since 4.7.0
     1860 *
     1861 * @param mixed $terms Raw term data from the 'tax_input' field.
     1862 * @return array
     1863 */
     1864function taxonomy_meta_box_sanitize_cb_input( $taxonomy, $terms ) {
     1865        /*
     1866         * Assume that a 'tax_input' string is a comma-separated list of term names.
     1867         * Some languages may use a character other than a comma as a delimiter, so we standardize on
     1868         * commas before parsing the list.
     1869         */
     1870        if ( ! is_array( $terms ) ) {
     1871                $comma = _x( ',', 'tag delimiter' );
     1872                if ( ',' !== $comma ) {
     1873                        $terms = str_replace( $comma, ',', $terms );
     1874                }
     1875                $terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) );
     1876        }
     1877
     1878        $clean_terms = array();
     1879        foreach ( $terms as $term ) {
     1880                // Empty terms are invalid input.
     1881                if ( empty( $term ) ) {
     1882                        continue;
     1883                }
     1884
     1885                $_term = get_terms( $taxonomy, array(
     1886                        'name' => $term,
     1887                        'fields' => 'ids',
     1888                        'hide_empty' => false,
     1889                ) );
     1890
     1891                if ( ! empty( $_term ) ) {
     1892                        $clean_terms[] = intval( $_term[0] );
     1893                } else {
     1894                        // No existing term was found, so pass the string. A new term will be created.
     1895                        $clean_terms[] = $term;
     1896                }
     1897        }
     1898
     1899        return $clean_terms;
     1900}
  • src/wp-includes/taxonomy.php

    diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php
    index 80e1f84..d149c28 100644
    a b function is_taxonomy_hierarchical($taxonomy) { 
    318318 *                                                post_categories_meta_box() is used for hierarchical taxonomies, and
    319319 *                                                post_tags_meta_box() is used for non-hierarchical. If false, no meta
    320320 *                                                box is shown.
     321 *     @type callable      $meta_box_sanitize_cb  Callback function for sanitizing taxonomy data saved from a meta
     322 *                                                box. If no callback is defined, an appropriate one is determined
     323 *                                                based on the value of `$meta_box_cb`.
    321324 *     @type array         $capabilities {
    322325 *         Array of capabilities for this taxonomy.
    323326 *
    function register_taxonomy( $taxonomy, $object_type, $args = array() ) { 
    380383                'show_in_quick_edit'    => null,
    381384                'show_admin_column'     => false,
    382385                'meta_box_cb'           => null,
     386                'meta_box_sanitize_cb'  => null,
    383387                'capabilities'          => array(),
    384388                'rewrite'               => true,
    385389                'query_var'             => $taxonomy,
    function register_taxonomy( $taxonomy, $object_type, $args = array() ) { 
    473477                        $args['meta_box_cb'] = 'post_tags_meta_box';
    474478        }
    475479
     480        if ( null === $args['meta_box_sanitize_cb'] ) {
     481                switch ( $args['meta_box_cb'] ) {
     482                        case 'post_categories_meta_box' :
     483                                $args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_checkboxes';
     484                        break;
     485
     486                        case 'post_tags_meta_box' :
     487                        default :
     488                                $args['meta_box_sanitize_cb'] = 'taxonomy_meta_box_sanitize_cb_input';
     489                        break;
     490                }
     491        }
     492
    476493        $wp_taxonomies[ $taxonomy ] = (object) $args;
    477494
    478495        // Register callback handling for meta box.