Make WordPress Core

Ticket #35991: 35991.4.patch

File 35991.4.patch, 7.3 KB (added by enrico.sorcinelli, 8 years ago)

Updated to trunk. This patch replaces the previous ones

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

     
    399399        }
    400400
    401401        /**
     402         * Retrieve custom fields for term.
     403         *
     404         * @since 4.8.0
     405         *
     406         * @param int $post_id Post ID.
     407         * @return array Custom fields, if exist.
     408         */
     409        public function get_term_custom_fields($term_id) {
     410                $term_id = (int) $term_id;
     411
     412                $custom_fields = array();
     413
     414                foreach ( (array) has_term_meta($term_id) as $meta ) {
     415
     416                        if ( ! current_user_can( 'edit_term_meta', $term_id ) ) {
     417                                continue;
     418                        }
     419
     420                        $custom_fields[] = array(
     421                                "id"    => $meta['meta_id'],
     422                                "key"   => $meta['meta_key'],
     423                                "value" => $meta['meta_value']
     424                        );
     425                }
     426
     427                return $custom_fields;
     428        }
     429       
     430        /**
     431         * Set custom fields for term.
     432         *
     433         * @since 4.8.0
     434         *
     435         * @param int $post_id Post ID.
     436         * @param array $fields Custom fields.
     437         */
     438        public function set_term_custom_fields($term_id, $fields) {
     439                $term_id = (int) $term_id;
     440
     441                foreach ( (array) $fields as $meta ) {
     442                        if ( isset($meta['id']) ) {
     443                                $meta['id'] = (int) $meta['id'];
     444                                $pmeta = get_metadata_by_mid( 'term', $meta['id'] );
     445                                if ( isset($meta['key']) ) {
     446                                        $meta['key'] = wp_unslash( $meta['key'] );
     447                                        if ( $meta['key'] !== $pmeta->meta_key ) {
     448                                                continue;
     449                                        }
     450                                        $meta['value'] = wp_unslash( $meta['value'] );
     451                                        if ( current_user_can( 'edit_term_meta', $term_id ) ) {
     452                                                update_metadata_by_mid( 'term', $meta['id'], $meta['value'] );
     453                                        }
     454                                } elseif ( current_user_can( 'delete_term_meta', $term_id ) ) {
     455                                        delete_metadata_by_mid( 'term', $meta['id'] );
     456                                }
     457                        } elseif ( current_user_can( 'add_term_meta', $term_id ) ) {
     458                                add_term_meta( $term_id, $meta['key'], $meta['value'] );
     459                        }
     460                }
     461        }
     462
     463        /**
    402464         * Set up blog options property.
    403465         *
    404466         * Passes property through {@see 'xmlrpc_blog_options'} filter.
     
    737799                // Count we are happy to return as an integer because people really shouldn't use terms that much.
    738800                $_term['count'] = intval( $_term['count'] );
    739801
     802                // Get term meta
     803                $_term['custom_fields'] = $this->get_term_custom_fields($_term['term_id']);
     804
    740805                /**
    741806                 * Filters XML-RPC-prepared data for the given term.
    742807                 *
     
    19201985                if ( ! $term )
    19211986                        return new IXR_Error( 500, __( 'Sorry, your term could not be created.' ) );
    19221987
     1988                // Add term meta
     1989                if ( isset( $content_struct['custom_fields'] ) ) {
     1990                        $this->set_term_custom_fields( $term['term_id'], $content_struct['custom_fields'] );
     1991                }
     1992
    19231993                return strval( $term['term_id'] );
    19241994        }
    19251995
     
    20192089                if ( ! $term )
    20202090                        return new IXR_Error( 500, __( 'Sorry, editing the term failed.' ) );
    20212091
     2092                // Update term meta
     2093                if ( isset( $content_struct['custom_fields'] ) ) {
     2094                        $this->set_term_custom_fields( $term_id, $content_struct['custom_fields'] );
     2095                }
     2096
    20222097                return true;
    20232098        }
    20242099
  • src/wp-includes/taxonomy.php

     
    12791279}
    12801280
    12811281/**
     1282 * Get meta data for the given term ID.
     1283 *
     1284 * @since 4.8.0
     1285 *
     1286 * @global wpdb $wpdb WordPress database abstraction object.
     1287 *
     1288 * @param int $term_id
     1289 * @return array|false
     1290 */
     1291function has_term_meta( $term_id ) {
     1292        // Bail if term meta table is not installed.
     1293        if ( get_option( 'db_version' ) < 34370 ) {
     1294                return;
     1295        }
     1296
     1297        global $wpdb;
     1298
     1299        return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, term_id
     1300                FROM $wpdb->termmeta WHERE term_id = %d
     1301                ORDER BY meta_key,meta_id", $term_id), ARRAY_A );
     1302}
     1303
     1304/**
    12821305 * Check if Term exists.
    12831306 *
    12841307 * Formerly is_term(), introduced in 2.3.0.
  • tests/phpunit/tests/term/meta.php

     
    407407        public static function set_cache_results( $q ) {
    408408                $q->set( 'cache_results', true );
    409409        }
     410
     411        /**
     412         * @ticket 35991
     413         */
     414        public function test_has_term_meta() {
     415                $t = self::factory()->term->create( array( 'taxonomy' => 'wptests_tax' ) );
     416               
     417                $term_meta_id = add_term_meta( $t, 'foo', 'bar' );
     418                $meta = has_term_meta( $t );
     419
     420                $this->assertInternalType( 'array', $meta );
     421                $this->assertEquals( array( 'meta_key' => 'foo', 'meta_value' => 'bar', 'meta_id' => $term_meta_id, 'term_id' => $t ), $meta[0] );
     422        }
    410423}
  • tests/phpunit/tests/xmlrpc/wp/getTerm.php

     
    7373                $result = $this->myxmlrpcserver->wp_getTerm( array( 1, 'editor', 'editor', 'category', self::$term_id ) );
    7474
    7575                $this->assertNotInstanceOf( 'IXR_Error', $result );
     76                unset($result['custom_fields']);
    7677                $this->assertEquals( $result, $term );
    7778
    7879                // Check DataTypes
     
    9596                $this->assertEquals( 'category', $result['taxonomy'] );
    9697                $this->assertEquals( $term['description'], $result['description'] );
    9798        }
     99
     100        /**
     101         * @ticket 35991
     102         */
     103        public function test_get_term_meta () {
     104                $this->make_user_by_role( 'editor' );
     105
     106                // Add term meta to test wp.getTerm
     107                add_term_meta( self::$term_id, 'foo', 'bar' );
     108
     109                $term = get_term( self::$term_id, 'category', ARRAY_A );
     110
     111                $result = $this->myxmlrpcserver->wp_getTerm( array( 1, 'editor', 'editor', 'category', self::$term_id ) );
     112                $this->assertNotInstanceOf( 'IXR_Error', $result );
     113                       
     114                $this->assertInternalType( 'array', $result['custom_fields'] );
     115                $term_meta = get_term_meta( self::$term_id, '', true );
     116                $this->assertEquals( $term_meta['foo'][0], $result['custom_fields'][0]['value'] );
     117        }
    98118}
  • tests/phpunit/tests/xmlrpc/wp/newTerm.php

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

     
    5050                foreach( $results as $term ) {
    5151                        $this->assertInternalType( 'int', $term['count'] );
    5252
     53                        // Check custom term meta
     54                        $this->assertInternalType( 'array', $term['custom_fields'] );
     55
    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'] );
    5558                        $this->assertStringMatchesFormat( '%d', $term['term_group'] );