Make WordPress Core

Ticket #35991: 35991_with_unit_tests.patch

File 35991_with_unit_tests.patch, 6.8 KB (added by enrico.sorcinelli, 9 years ago)

This patch containing also the unit tests replaces the previous one.

  • src/wp-includes/class-wp-xmlrpc-server.php

     
    386386        }
    387387
    388388        /**
     389         * Retrieve custom fields for term.
     390         *
     391         * @since 4.5.x
     392         *
     393         * @param int $post_id Post ID.
     394         * @return array Custom fields, if exist.
     395         */
     396        public function get_term_custom_fields($term_id) {
     397                $term_id = (int) $term_id;
     398       
     399                $custom_fields = array();
     400       
     401                foreach ( (array) has_term_meta($term_id) as $meta ) {
     402                        if ( ! current_user_can( 'edit_term_meta', $term_id , $meta['meta_key'] ) )
     403                                continue;
     404                        $custom_fields[] = array(
     405                                "id"    => $meta['meta_id'],
     406                                "key"   => $meta['meta_key'],
     407                                "value" => $meta['meta_value']
     408                        );
     409                }
     410       
     411                return $custom_fields;
     412        }
     413       
     414        /**
     415         * Set custom fields for term.
     416         *
     417         * @since 4.5.x
     418         *
     419         * @param int $post_id Post ID.
     420         * @param array $fields Custom fields.
     421         */
     422        public function set_term_custom_fields($term_id, $fields) {
     423                $term_id = (int) $term_id;
     424
     425                foreach ( (array) $fields as $meta ) {
     426                        if ( isset($meta['id']) ) {
     427                                $meta['id'] = (int) $meta['id'];
     428                                $pmeta = get_metadata_by_mid( 'term', $meta['id'] );
     429                                if ( isset($meta['key']) ) {
     430                                        $meta['key'] = wp_unslash( $meta['key'] );
     431                                        if ( $meta['key'] !== $pmeta->meta_key )
     432                                                continue;
     433                                        $meta['value'] = wp_unslash( $meta['value'] );
     434                                        if ( current_user_can( 'edit_term_meta', $term_id, $meta['key'] ) )
     435                                                update_metadata_by_mid( 'term', $meta['id'], $meta['value'] );
     436                                } elseif ( current_user_can( 'delete_term_meta', $term_id, $pmeta->meta_key ) ) {
     437                                        delete_metadata_by_mid( 'term', $meta['id'] );
     438                                }
     439                        } elseif ( current_user_can( 'add_term_meta', $term_id, wp_unslash( $meta['key'] ) ) ) {
     440                                add_term_meta( $term_id, $meta['key'], $meta['value'] );
     441                        }
     442                }
     443        }
     444
     445        /**
    389446         * Set up blog options property.
    390447         *
    391448         * Passes property through {@see 'xmlrpc_blog_options'} filter.
     
    724781                // Count we are happy to return as an integer because people really shouldn't use terms that much.
    725782                $_term['count'] = intval( $_term['count'] );
    726783
     784                // Get term meta
     785                $_term['custom_fields'] = $this->get_term_custom_fields($_term['term_id']);
     786
    727787                /**
    728788                 * Filter XML-RPC-prepared data for the given term.
    729789                 *
     
    18971957                if ( ! $term )
    18981958                        return new IXR_Error( 500, __( 'Sorry, your term could not be created. Something wrong happened.' ) );
    18991959
     1960                if ( isset( $content_struct['custom_fields'] ) ) {
     1961                        $this->set_term_custom_fields( $term['term_id'], $content_struct['custom_fields'] );
     1962                }
     1963
    19001964                return strval( $term['term_id'] );
    19011965        }
    19021966
     
    19952059                if ( ! $term )
    19962060                        return new IXR_Error( 500, __( 'Sorry, editing the term failed.' ) );
    19972061
     2062                // Update term meta
     2063                if ( isset( $content_struct['custom_fields'] ) ) {
     2064                        $this->set_term_custom_fields( $term_id, $content_struct['custom_fields'] );
     2065                }
     2066
    19982067                return true;
    19992068        }
    20002069
  • src/wp-includes/taxonomy.php

     
    18771877}
    18781878
    18791879/**
     1880 * Get meta data for the given term ID.
     1881 *
     1882 * @since 4.4.x
     1883 *
     1884 * @global wpdb $wpdb WordPress database abstraction object.
     1885 *
     1886 * @param int $term_id
     1887 * @return array|false
     1888 */
     1889function has_term_meta( $term_id ) {
     1890        // Bail if term meta table is not installed.
     1891        if ( get_option( 'db_version' ) < 34370 ) {
     1892                return;
     1893        }
     1894
     1895        global $wpdb;
     1896
     1897        return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, term_id
     1898                FROM $wpdb->termmeta WHERE term_id = %d
     1899                ORDER BY meta_key,meta_id", $term_id), ARRAY_A );
     1900}
     1901
     1902/**
    18801903 * Check if Term exists.
    18811904 *
    18821905 * Formerly is_term(), introduced in 2.3.0.
  • tests/phpunit/tests/term/meta.php

     
    352352        public static function set_cache_results( $q ) {
    353353                $q->set( 'cache_results', true );
    354354        }
     355       
     356        /**
     357         * @ticket 35991
     358         */
     359        public function test_has_term_meta() {
     360                $t = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) );
     361               
     362                $term_meta_id = add_term_meta( $t, 'foo', 'bar' );
     363                $meta = has_term_meta( $t );
     364
     365                $this->assertInternalType( 'array', $meta );
     366                $this->assertEquals( array( 'meta_key' => 'foo', 'meta_value' => 'bar', 'meta_id' => $term_meta_id, 'term_id' => $t ), $meta[0] );
     367        }
     368
    355369}
  • tests/phpunit/tests/xmlrpc/wp/getTerm.php

     
    7373                $result = $this->myxmlrpcserver->wp_getTerm( array( 1, 'editor', 'editor', 'category', $this->term['term_id'] ) );
    7474
    7575                $this->assertNotInstanceOf( 'IXR_Error', $result );
     76               
     77                // Check custom term meta
     78                $this->assertInternalType( 'array', $result['custom_fields'] );
     79
     80                unset($result['custom_fields']);
    7681                $this->assertEquals( $result, $term );
    77 
     82               
    7883                // Check DataTypes
    7984                $this->assertInternalType( 'string', $result['name'] );
    8085                $this->assertInternalType( 'string', $result['slug'] );
  • tests/phpunit/tests/xmlrpc/wp/newTerm.php

     
    107107                $this->assertNotInstanceOf( 'IXR_Error', $result );
    108108                $this->assertStringMatchesFormat( '%d', $result );
    109109        }
     110       
     111        /**
     112         * @ticket 35991
     113         */
     114        public function test_add_term_meta() {
     115                $this->make_user_by_role( 'editor' );
     116                $result = $this->myxmlrpcserver->wp_newTerm( array( 1, 'editor', 'editor', array( 'taxonomy' => 'category', 'name' => 'Test meta', 'custom_fields' => array( array('key' => 'key1', 'value' => 'value1') ) ) ) );
     117                $this->assertNotInstanceOf( 'IXR_Error', $result );
     118                $this->assertStringMatchesFormat( '%d', $result );
     119        }
     120
    110121}
     122 No newline at end of file
  • tests/phpunit/tests/xmlrpc/wp/getTerms.php

     
    4949
    5050                foreach( $results as $term ) {
    5151                        $this->assertInternalType( 'int', $term['count'] );
     52                       
     53                        // Check custom term meta
     54                        $this->assertInternalType( 'array', $term['custom_fields'] );
    5255
    5356                        // We expect all other IDs to be strings not integers so we don't return something larger than an XMLRPC integer can describe.
    5457                        $this->assertStringMatchesFormat( '%d', $term['term_id'] );