[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/ -> deprecated.php (source)

   1  <?php
   2  /**
   3   * Deprecated functions from past WordPress versions. You shouldn't use these
   4   * functions and look for the alternatives instead. The functions will be
   5   * removed in a later version.
   6   *
   7   * @package WordPress
   8   * @subpackage Deprecated
   9   */
  10  
  11  /*
  12   * Deprecated functions come here to die.
  13   */
  14  
  15  /**
  16   * Retrieves all post data for a given post.
  17   *
  18   * @since 0.71
  19   * @deprecated 1.5.1 Use get_post()
  20   * @see get_post()
  21   *
  22   * @param int $postid Post ID.
  23   * @return array Post data.
  24   */
  25  function get_postdata($postid) {
  26      _deprecated_function( __FUNCTION__, '1.5.1', 'get_post()' );
  27  
  28      $post = get_post($postid);
  29  
  30      $postdata = array (
  31          'ID' => $post->ID,
  32          'Author_ID' => $post->post_author,
  33          'Date' => $post->post_date,
  34          'Content' => $post->post_content,
  35          'Excerpt' => $post->post_excerpt,
  36          'Title' => $post->post_title,
  37          'Category' => $post->post_category,
  38          'post_status' => $post->post_status,
  39          'comment_status' => $post->comment_status,
  40          'ping_status' => $post->ping_status,
  41          'post_password' => $post->post_password,
  42          'to_ping' => $post->to_ping,
  43          'pinged' => $post->pinged,
  44          'post_type' => $post->post_type,
  45          'post_name' => $post->post_name
  46      );
  47  
  48      return $postdata;
  49  }
  50  
  51  /**
  52   * Sets up the WordPress Loop.
  53   *
  54   * Use The Loop instead.
  55   *
  56   * @link https://developer.wordpress.org/themes/basics/the-loop/
  57   *
  58   * @since 1.0.1
  59   * @deprecated 1.5.0
  60   *
  61   * @global WP_Query $wp_query WordPress Query object.
  62   */
  63  function start_wp() {
  64      global $wp_query;
  65  
  66      _deprecated_function( __FUNCTION__, '1.5.0', __('new WordPress Loop') );
  67  
  68      // Since the old style loop is being used, advance the query iterator here.
  69      $wp_query->next_post();
  70  
  71      setup_postdata( get_post() );
  72  }
  73  
  74  /**
  75   * Returns or prints a category ID.
  76   *
  77   * @since 0.71
  78   * @deprecated 0.71 Use get_the_category()
  79   * @see get_the_category()
  80   *
  81   * @param bool $display Optional. Whether to display the output. Default true.
  82   * @return int Category ID.
  83   */
  84  function the_category_ID($display = true) {
  85      _deprecated_function( __FUNCTION__, '0.71', 'get_the_category()' );
  86  
  87      // Grab the first cat in the list.
  88      $categories = get_the_category();
  89      $cat = $categories[0]->term_id;
  90  
  91      if ( $display )
  92          echo $cat;
  93  
  94      return $cat;
  95  }
  96  
  97  /**
  98   * Prints a category with optional text before and after.
  99   *
 100   * @since 0.71
 101   * @deprecated 0.71 Use get_the_category_by_ID()
 102   * @see get_the_category_by_ID()
 103   *
 104   * @param string $before Optional. Text to display before the category. Default empty.
 105   * @param string $after  Optional. Text to display after the category. Default empty.
 106   */
 107  function the_category_head( $before = '', $after = '' ) {
 108      global $currentcat, $previouscat;
 109  
 110      _deprecated_function( __FUNCTION__, '0.71', 'get_the_category_by_ID()' );
 111  
 112      // Grab the first cat in the list.
 113      $categories = get_the_category();
 114      $currentcat = $categories[0]->category_id;
 115      if ( $currentcat != $previouscat ) {
 116          echo $before;
 117          echo get_the_category_by_ID($currentcat);
 118          echo $after;
 119          $previouscat = $currentcat;
 120      }
 121  }
 122  
 123  /**
 124   * Prints a link to the previous post.
 125   *
 126   * @since 1.5.0
 127   * @deprecated 2.0.0 Use previous_post_link()
 128   * @see previous_post_link()
 129   *
 130   * @param string $format
 131   * @param string $previous
 132   * @param string $title
 133   * @param string $in_same_cat
 134   * @param int    $limitprev
 135   * @param string $excluded_categories
 136   */
 137  function previous_post($format='%', $previous='previous post: ', $title='yes', $in_same_cat='no', $limitprev=1, $excluded_categories='') {
 138  
 139      _deprecated_function( __FUNCTION__, '2.0.0', 'previous_post_link()' );
 140  
 141      if ( empty($in_same_cat) || 'no' == $in_same_cat )
 142          $in_same_cat = false;
 143      else
 144          $in_same_cat = true;
 145  
 146      $post = get_previous_post($in_same_cat, $excluded_categories);
 147  
 148      if ( !$post )
 149          return;
 150  
 151      $string = '<a href="'.get_permalink($post->ID).'">'.$previous;
 152      if ( 'yes' == $title )
 153          /** This filter is documented in wp-includes/post-template.php */
 154          $string .= apply_filters('the_title', $post->post_title, $post->ID);
 155      $string .= '</a>';
 156      $format = str_replace('%', $string, $format);
 157      echo $format;
 158  }
 159  
 160  /**
 161   * Prints link to the next post.
 162   *
 163   * @since 0.71
 164   * @deprecated 2.0.0 Use next_post_link()
 165   * @see next_post_link()
 166   *
 167   * @param string $format
 168   * @param string $next
 169   * @param string $title
 170   * @param string $in_same_cat
 171   * @param int $limitnext
 172   * @param string $excluded_categories
 173   */
 174  function next_post($format='%', $next='next post: ', $title='yes', $in_same_cat='no', $limitnext=1, $excluded_categories='') {
 175      _deprecated_function( __FUNCTION__, '2.0.0', 'next_post_link()' );
 176  
 177      if ( empty($in_same_cat) || 'no' == $in_same_cat )
 178          $in_same_cat = false;
 179      else
 180          $in_same_cat = true;
 181  
 182      $post = get_next_post($in_same_cat, $excluded_categories);
 183  
 184      if ( !$post    )
 185          return;
 186  
 187      $string = '<a href="'.get_permalink($post->ID).'">'.$next;
 188      if ( 'yes' == $title )
 189          /** This filter is documented in wp-includes/post-template.php */
 190          $string .= apply_filters('the_title', $post->post_title, $post->ID);
 191      $string .= '</a>';
 192      $format = str_replace('%', $string, $format);
 193      echo $format;
 194  }
 195  
 196  /**
 197   * Whether user can create a post.
 198   *
 199   * @since 1.5.0
 200   * @deprecated 2.0.0 Use current_user_can()
 201   * @see current_user_can()
 202   *
 203   * @param int $user_id
 204   * @param int $blog_id Not Used
 205   * @param int $category_id Not Used
 206   * @return bool
 207   */
 208  function user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') {
 209      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 210  
 211      $author_data = get_userdata($user_id);
 212      return ($author_data->user_level > 1);
 213  }
 214  
 215  /**
 216   * Whether user can create a post.
 217   *
 218   * @since 1.5.0
 219   * @deprecated 2.0.0 Use current_user_can()
 220   * @see current_user_can()
 221   *
 222   * @param int $user_id
 223   * @param int $blog_id Not Used
 224   * @param int $category_id Not Used
 225   * @return bool
 226   */
 227  function user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') {
 228      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 229  
 230      $author_data = get_userdata($user_id);
 231      return ($author_data->user_level >= 1);
 232  }
 233  
 234  /**
 235   * Whether user can edit a post.
 236   *
 237   * @since 1.5.0
 238   * @deprecated 2.0.0 Use current_user_can()
 239   * @see current_user_can()
 240   *
 241   * @param int $user_id
 242   * @param int $post_id
 243   * @param int $blog_id Not Used
 244   * @return bool
 245   */
 246  function user_can_edit_post($user_id, $post_id, $blog_id = 1) {
 247      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 248  
 249      $author_data = get_userdata($user_id);
 250      $post = get_post($post_id);
 251      $post_author_data = get_userdata($post->post_author);
 252  
 253      if ( (($user_id == $post_author_data->ID) && !($post->post_status == 'publish' && $author_data->user_level < 2))
 254              || ($author_data->user_level > $post_author_data->user_level)
 255              || ($author_data->user_level >= 10) ) {
 256          return true;
 257      } else {
 258          return false;
 259      }
 260  }
 261  
 262  /**
 263   * Whether user can delete a post.
 264   *
 265   * @since 1.5.0
 266   * @deprecated 2.0.0 Use current_user_can()
 267   * @see current_user_can()
 268   *
 269   * @param int $user_id
 270   * @param int $post_id
 271   * @param int $blog_id Not Used
 272   * @return bool
 273   */
 274  function user_can_delete_post($user_id, $post_id, $blog_id = 1) {
 275      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 276  
 277      // Right now if one can edit, one can delete.
 278      return user_can_edit_post($user_id, $post_id, $blog_id);
 279  }
 280  
 281  /**
 282   * Whether user can set new posts' dates.
 283   *
 284   * @since 1.5.0
 285   * @deprecated 2.0.0 Use current_user_can()
 286   * @see current_user_can()
 287   *
 288   * @param int $user_id
 289   * @param int $blog_id Not Used
 290   * @param int $category_id Not Used
 291   * @return bool
 292   */
 293  function user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') {
 294      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 295  
 296      $author_data = get_userdata($user_id);
 297      return (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id));
 298  }
 299  
 300  /**
 301   * Whether user can delete a post.
 302   *
 303   * @since 1.5.0
 304   * @deprecated 2.0.0 Use current_user_can()
 305   * @see current_user_can()
 306   *
 307   * @param int $user_id
 308   * @param int $post_id
 309   * @param int $blog_id Not Used
 310   * @return bool returns true if $user_id can edit $post_id's date
 311   */
 312  function user_can_edit_post_date($user_id, $post_id, $blog_id = 1) {
 313      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 314  
 315      $author_data = get_userdata($user_id);
 316      return (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id));
 317  }
 318  
 319  /**
 320   * Whether user can delete a post.
 321   *
 322   * @since 1.5.0
 323   * @deprecated 2.0.0 Use current_user_can()
 324   * @see current_user_can()
 325   *
 326   * @param int $user_id
 327   * @param int $post_id
 328   * @param int $blog_id Not Used
 329   * @return bool returns true if $user_id can edit $post_id's comments
 330   */
 331  function user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) {
 332      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 333  
 334      // Right now if one can edit a post, one can edit comments made on it.
 335      return user_can_edit_post($user_id, $post_id, $blog_id);
 336  }
 337  
 338  /**
 339   * Whether user can delete a post.
 340   *
 341   * @since 1.5.0
 342   * @deprecated 2.0.0 Use current_user_can()
 343   * @see current_user_can()
 344   *
 345   * @param int $user_id
 346   * @param int $post_id
 347   * @param int $blog_id Not Used
 348   * @return bool returns true if $user_id can delete $post_id's comments
 349   */
 350  function user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) {
 351      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 352  
 353      // Right now if one can edit comments, one can delete comments.
 354      return user_can_edit_post_comments($user_id, $post_id, $blog_id);
 355  }
 356  
 357  /**
 358   * Can user can edit other user.
 359   *
 360   * @since 1.5.0
 361   * @deprecated 2.0.0 Use current_user_can()
 362   * @see current_user_can()
 363   *
 364   * @param int $user_id
 365   * @param int $other_user
 366   * @return bool
 367   */
 368  function user_can_edit_user($user_id, $other_user) {
 369      _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' );
 370  
 371      $user  = get_userdata($user_id);
 372      $other = get_userdata($other_user);
 373      if ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID )
 374          return true;
 375      else
 376          return false;
 377  }
 378  
 379  /**
 380   * Gets the links associated with category $cat_name.
 381   *
 382   * @since 0.71
 383   * @deprecated 2.1.0 Use get_bookmarks()
 384   * @see get_bookmarks()
 385   *
 386   * @param string $cat_name         Optional. The category name to use. If no match is found, uses all.
 387   *                                 Default 'noname'.
 388   * @param string $before           Optional. The HTML to output before the link. Default empty.
 389   * @param string $after            Optional. The HTML to output after the link. Default '<br />'.
 390   * @param string $between          Optional. The HTML to output between the link/image and its description.
 391   *                                 Not used if no image or $show_images is true. Default ' '.
 392   * @param bool   $show_images      Optional. Whether to show images (if defined). Default true.
 393   * @param string $orderby          Optional. The order to output the links. E.g. 'id', 'name', 'url',
 394   *                                 'description', 'rating', or 'owner'. Default 'id'.
 395   *                                 If you start the name with an underscore, the order will be reversed.
 396   *                                 Specifying 'rand' as the order will return links in a random order.
 397   * @param bool   $show_description Optional. Whether to show the description if show_images=false/not defined.
 398   *                                 Default true.
 399   * @param bool   $show_rating      Optional. Show rating stars/chars. Default false.
 400   * @param int    $limit            Optional. Limit to X entries. If not specified, all entries are shown.
 401   *                                 Default -1.
 402   * @param int    $show_updated     Optional. Whether to show last updated timestamp. Default 0.
 403   */
 404  function get_linksbyname($cat_name = "noname", $before = '', $after = '<br />', $between = " ", $show_images = true, $orderby = 'id',
 405                          $show_description = true, $show_rating = false,
 406                          $limit = -1, $show_updated = 0) {
 407      _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );
 408  
 409      $cat_id = -1;
 410      $cat = get_term_by('name', $cat_name, 'link_category');
 411      if ( $cat )
 412          $cat_id = $cat->term_id;
 413  
 414      get_links($cat_id, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated);
 415  }
 416  
 417  /**
 418   * Gets the links associated with the named category.
 419   *
 420   * @since 1.0.1
 421   * @deprecated 2.1.0 Use wp_list_bookmarks()
 422   * @see wp_list_bookmarks()
 423   *
 424   * @param string $category The category to use.
 425   * @param string $args
 426   * @return string|null
 427   */
 428  function wp_get_linksbyname($category, $args = '') {
 429      _deprecated_function(__FUNCTION__, '2.1.0', 'wp_list_bookmarks()');
 430  
 431      $defaults = array(
 432          'after' => '<br />',
 433          'before' => '',
 434          'categorize' => 0,
 435          'category_after' => '',
 436          'category_before' => '',
 437          'category_name' => $category,
 438          'show_description' => 1,
 439          'title_li' => '',
 440      );
 441  
 442      $parsed_args = wp_parse_args( $args, $defaults );
 443  
 444      return wp_list_bookmarks($parsed_args);
 445  }
 446  
 447  /**
 448   * Gets an array of link objects associated with category $cat_name.
 449   *
 450   *     $links = get_linkobjectsbyname( 'fred' );
 451   *     foreach ( $links as $link ) {
 452   *          echo '<li>' . $link->link_name . '</li>';
 453   *     }
 454   *
 455   * @since 1.0.1
 456   * @deprecated 2.1.0 Use get_bookmarks()
 457   * @see get_bookmarks()
 458   *
 459   * @param string $cat_name Optional. The category name to use. If no match is found, uses all.
 460   *                         Default 'noname'.
 461   * @param string $orderby  Optional. The order to output the links. E.g. 'id', 'name', 'url',
 462   *                         'description', 'rating', or 'owner'. Default 'name'.
 463   *                         If you start the name with an underscore, the order will be reversed.
 464   *                         Specifying 'rand' as the order will return links in a random order.
 465   * @param int    $limit    Optional. Limit to X entries. If not specified, all entries are shown.
 466   *                         Default -1.
 467   * @return array
 468   */
 469  function get_linkobjectsbyname($cat_name = "noname" , $orderby = 'name', $limit = -1) {
 470      _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );
 471  
 472      $cat_id = -1;
 473      $cat = get_term_by('name', $cat_name, 'link_category');
 474      if ( $cat )
 475          $cat_id = $cat->term_id;
 476  
 477      return get_linkobjects($cat_id, $orderby, $limit);
 478  }
 479  
 480  /**
 481   * Gets an array of link objects associated with category n.
 482   *
 483   * Usage:
 484   *
 485   *     $links = get_linkobjects(1);
 486   *     if ($links) {
 487   *         foreach ($links as $link) {
 488   *             echo '<li>'.$link->link_name.'<br />'.$link->link_description.'</li>';
 489   *         }
 490   *     }
 491   *
 492   * Fields are:
 493   *
 494   * - link_id
 495   * - link_url
 496   * - link_name
 497   * - link_image
 498   * - link_target
 499   * - link_category
 500   * - link_description
 501   * - link_visible
 502   * - link_owner
 503   * - link_rating
 504   * - link_updated
 505   * - link_rel
 506   * - link_notes
 507   *
 508   * @since 1.0.1
 509   * @deprecated 2.1.0 Use get_bookmarks()
 510   * @see get_bookmarks()
 511   *
 512   * @param int    $category Optional. The category to use. If no category supplied, uses all.
 513   *                         Default 0.
 514   * @param string $orderby  Optional. The order to output the links. E.g. 'id', 'name', 'url',
 515   *                         'description', 'rating', or 'owner'. Default 'name'.
 516   *                         If you start the name with an underscore, the order will be reversed.
 517   *                         Specifying 'rand' as the order will return links in a random order.
 518   * @param int    $limit    Optional. Limit to X entries. If not specified, all entries are shown.
 519   *                         Default 0.
 520   * @return array
 521   */
 522  function get_linkobjects($category = 0, $orderby = 'name', $limit = 0) {
 523      _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );
 524  
 525      $links = get_bookmarks( array( 'category' => $category, 'orderby' => $orderby, 'limit' => $limit ) ) ;
 526  
 527      $links_array = array();
 528      foreach ($links as $link)
 529          $links_array[] = $link;
 530  
 531      return $links_array;
 532  }
 533  
 534  /**
 535   * Gets the links associated with category 'cat_name' and display rating stars/chars.
 536   *
 537   * @since 0.71
 538   * @deprecated 2.1.0 Use get_bookmarks()
 539   * @see get_bookmarks()
 540   *
 541   * @param string $cat_name         Optional. The category name to use. If no match is found, uses all.
 542   *                                 Default 'noname'.
 543   * @param string $before           Optional. The HTML to output before the link. Default empty.
 544   * @param string $after            Optional. The HTML to output after the link. Default '<br />'.
 545   * @param string $between          Optional. The HTML to output between the link/image and its description.
 546   *                                 Not used if no image or $show_images is true. Default ' '.
 547   * @param bool   $show_images      Optional. Whether to show images (if defined). Default true.
 548   * @param string $orderby          Optional. The order to output the links. E.g. 'id', 'name', 'url',
 549   *                                 'description', 'rating', or 'owner'. Default 'id'.
 550   *                                 If you start the name with an underscore, the order will be reversed.
 551   *                                 Specifying 'rand' as the order will return links in a random order.
 552   * @param bool   $show_description Optional. Whether to show the description if show_images=false/not defined.
 553   *                                 Default true.
 554   * @param int    $limit               Optional. Limit to X entries. If not specified, all entries are shown.
 555   *                                 Default -1.
 556   * @param int    $show_updated     Optional. Whether to show last updated timestamp. Default 0.
 557   */
 558  function get_linksbyname_withrating($cat_name = "noname", $before = '', $after = '<br />', $between = " ",
 559                                      $show_images = true, $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) {
 560      _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );
 561  
 562      get_linksbyname($cat_name, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated);
 563  }
 564  
 565  /**
 566   * Gets the links associated with category n and display rating stars/chars.
 567   *
 568   * @since 0.71
 569   * @deprecated 2.1.0 Use get_bookmarks()
 570   * @see get_bookmarks()
 571   *
 572   * @param int    $category         Optional. The category to use. If no category supplied, uses all.
 573   *                                 Default 0.
 574   * @param string $before           Optional. The HTML to output before the link. Default empty.
 575   * @param string $after            Optional. The HTML to output after the link. Default '<br />'.
 576   * @param string $between          Optional. The HTML to output between the link/image and its description.
 577   *                                 Not used if no image or $show_images is true. Default ' '.
 578   * @param bool   $show_images      Optional. Whether to show images (if defined). Default true.
 579   * @param string $orderby          Optional. The order to output the links. E.g. 'id', 'name', 'url',
 580   *                                 'description', 'rating', or 'owner'. Default 'id'.
 581   *                                 If you start the name with an underscore, the order will be reversed.
 582   *                                 Specifying 'rand' as the order will return links in a random order.
 583   * @param bool   $show_description Optional. Whether to show the description if show_images=false/not defined.
 584   *                                 Default true.
 585   * @param int    $limit               Optional. Limit to X entries. If not specified, all entries are shown.
 586   *                                 Default -1.
 587   * @param int    $show_updated     Optional. Whether to show last updated timestamp. Default 0.
 588   */
 589  function get_links_withrating($category = -1, $before = '', $after = '<br />', $between = " ", $show_images = true,
 590                              $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) {
 591      _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );
 592  
 593      get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated);
 594  }
 595  
 596  /**
 597   * Gets the auto_toggle setting.
 598   *
 599   * @since 0.71
 600   * @deprecated 2.1.0
 601   *
 602   * @param int $id The category to get. If no category supplied uses 0
 603   * @return int Only returns 0.
 604   */
 605  function get_autotoggle($id = 0) {
 606      _deprecated_function( __FUNCTION__, '2.1.0' );
 607      return 0;
 608  }
 609  
 610  /**
 611   * Lists categories.
 612   *
 613   * @since 0.71
 614   * @deprecated 2.1.0 Use wp_list_categories()
 615   * @see wp_list_categories()
 616   *
 617   * @param int $optionall
 618   * @param string $all
 619   * @param string $sort_column
 620   * @param string $sort_order
 621   * @param string $file
 622   * @param bool $list
 623   * @param int $optiondates
 624   * @param int $optioncount
 625   * @param int $hide_empty
 626   * @param int $use_desc_for_title
 627   * @param bool $children
 628   * @param int $child_of
 629   * @param int $categories
 630   * @param int $recurse
 631   * @param string $feed
 632   * @param string $feed_image
 633   * @param string $exclude
 634   * @param bool $hierarchical
 635   * @return null|false
 636   */
 637  function list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0,
 638                  $optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=false, $child_of=0, $categories=0,
 639                  $recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=false) {
 640      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' );
 641  
 642      $query = compact('optionall', 'all', 'sort_column', 'sort_order', 'file', 'list', 'optiondates', 'optioncount', 'hide_empty', 'use_desc_for_title', 'children',
 643          'child_of', 'categories', 'recurse', 'feed', 'feed_image', 'exclude', 'hierarchical');
 644      return wp_list_cats($query);
 645  }
 646  
 647  /**
 648   * Lists categories.
 649   *
 650   * @since 1.2.0
 651   * @deprecated 2.1.0 Use wp_list_categories()
 652   * @see wp_list_categories()
 653   *
 654   * @param string|array $args
 655   * @return null|string|false
 656   */
 657  function wp_list_cats($args = '') {
 658      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' );
 659  
 660      $parsed_args = wp_parse_args( $args );
 661  
 662      // Map to new names.
 663      if ( isset($parsed_args['optionall']) && isset($parsed_args['all']))
 664          $parsed_args['show_option_all'] = $parsed_args['all'];
 665      if ( isset($parsed_args['sort_column']) )
 666          $parsed_args['orderby'] = $parsed_args['sort_column'];
 667      if ( isset($parsed_args['sort_order']) )
 668          $parsed_args['order'] = $parsed_args['sort_order'];
 669      if ( isset($parsed_args['optiondates']) )
 670          $parsed_args['show_last_update'] = $parsed_args['optiondates'];
 671      if ( isset($parsed_args['optioncount']) )
 672          $parsed_args['show_count'] = $parsed_args['optioncount'];
 673      if ( isset($parsed_args['list']) )
 674          $parsed_args['style'] = $parsed_args['list'] ? 'list' : 'break';
 675      $parsed_args['title_li'] = '';
 676  
 677      return wp_list_categories($parsed_args);
 678  }
 679  
 680  /**
 681   * Deprecated method for generating a drop-down of categories.
 682   *
 683   * @since 0.71
 684   * @deprecated 2.1.0 Use wp_dropdown_categories()
 685   * @see wp_dropdown_categories()
 686   *
 687   * @param int $optionall
 688   * @param string $all
 689   * @param string $orderby
 690   * @param string $order
 691   * @param int $show_last_update
 692   * @param int $show_count
 693   * @param int $hide_empty
 694   * @param bool $optionnone
 695   * @param int $selected
 696   * @param int $exclude
 697   * @return string
 698   */
 699  function dropdown_cats($optionall = 1, $all = 'All', $orderby = 'ID', $order = 'asc',
 700          $show_last_update = 0, $show_count = 0, $hide_empty = 1, $optionnone = false,
 701          $selected = 0, $exclude = 0) {
 702      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_dropdown_categories()' );
 703  
 704      $show_option_all = '';
 705      if ( $optionall )
 706          $show_option_all = $all;
 707  
 708      $show_option_none = '';
 709      if ( $optionnone )
 710          $show_option_none = _x( 'None', 'Categories dropdown (show_option_none parameter)' );
 711  
 712      $vars = compact('show_option_all', 'show_option_none', 'orderby', 'order',
 713                      'show_last_update', 'show_count', 'hide_empty', 'selected', 'exclude');
 714      $query = add_query_arg($vars, '');
 715      return wp_dropdown_categories($query);
 716  }
 717  
 718  /**
 719   * Lists authors.
 720   *
 721   * @since 1.2.0
 722   * @deprecated 2.1.0 Use wp_list_authors()
 723   * @see wp_list_authors()
 724   *
 725   * @param bool $optioncount
 726   * @param bool $exclude_admin
 727   * @param bool $show_fullname
 728   * @param bool $hide_empty
 729   * @param string $feed
 730   * @param string $feed_image
 731   * @return null|string
 732   */
 733  function list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') {
 734      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_authors()' );
 735  
 736      $args = compact('optioncount', 'exclude_admin', 'show_fullname', 'hide_empty', 'feed', 'feed_image');
 737      return wp_list_authors($args);
 738  }
 739  
 740  /**
 741   * Retrieves a list of post categories.
 742   *
 743   * @since 1.0.1
 744   * @deprecated 2.1.0 Use wp_get_post_categories()
 745   * @see wp_get_post_categories()
 746   *
 747   * @param int $blogid Not Used
 748   * @param int $post_id
 749   * @return array
 750   */
 751  function wp_get_post_cats($blogid = '1', $post_id = 0) {
 752      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_post_categories()' );
 753      return wp_get_post_categories($post_id);
 754  }
 755  
 756  /**
 757   * Sets the categories that the post ID belongs to.
 758   *
 759   * @since 1.0.1
 760   * @deprecated 2.1.0
 761   * @deprecated Use wp_set_post_categories()
 762   * @see wp_set_post_categories()
 763   *
 764   * @param int $blogid Not used
 765   * @param int $post_id
 766   * @param array $post_categories
 767   * @return bool|mixed
 768   */
 769  function wp_set_post_cats($blogid = '1', $post_id = 0, $post_categories = array()) {
 770      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_set_post_categories()' );
 771      return wp_set_post_categories($post_id, $post_categories);
 772  }
 773  
 774  /**
 775   * Retrieves a list of archives.
 776   *
 777   * @since 0.71
 778   * @deprecated 2.1.0 Use wp_get_archives()
 779   * @see wp_get_archives()
 780   *
 781   * @param string $type
 782   * @param string $limit
 783   * @param string $format
 784   * @param string $before
 785   * @param string $after
 786   * @param bool $show_post_count
 787   * @return string|null
 788   */
 789  function get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) {
 790      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_archives()' );
 791      $args = compact('type', 'limit', 'format', 'before', 'after', 'show_post_count');
 792      return wp_get_archives($args);
 793  }
 794  
 795  /**
 796   * Returns or Prints link to the author's posts.
 797   *
 798   * @since 1.2.0
 799   * @deprecated 2.1.0 Use get_author_posts_url()
 800   * @see get_author_posts_url()
 801   *
 802   * @param bool $display
 803   * @param int $author_id
 804   * @param string $author_nicename Optional.
 805   * @return string|null
 806   */
 807  function get_author_link($display, $author_id, $author_nicename = '') {
 808      _deprecated_function( __FUNCTION__, '2.1.0', 'get_author_posts_url()' );
 809  
 810      $link = get_author_posts_url($author_id, $author_nicename);
 811  
 812      if ( $display )
 813          echo $link;
 814      return $link;
 815  }
 816  
 817  /**
 818   * Print list of pages based on arguments.
 819   *
 820   * @since 0.71
 821   * @deprecated 2.1.0 Use wp_link_pages()
 822   * @see wp_link_pages()
 823   *
 824   * @param string $before
 825   * @param string $after
 826   * @param string $next_or_number
 827   * @param string $nextpagelink
 828   * @param string $previouspagelink
 829   * @param string $pagelink
 830   * @param string $more_file
 831   * @return string
 832   */
 833  function link_pages($before='<br />', $after='<br />', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page',
 834                      $pagelink='%', $more_file='') {
 835      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_link_pages()' );
 836  
 837      $args = compact('before', 'after', 'next_or_number', 'nextpagelink', 'previouspagelink', 'pagelink', 'more_file');
 838      return wp_link_pages($args);
 839  }
 840  
 841  /**
 842   * Get value based on option.
 843   *
 844   * @since 0.71
 845   * @deprecated 2.1.0 Use get_option()
 846   * @see get_option()
 847   *
 848   * @param string $option
 849   * @return string
 850   */
 851  function get_settings($option) {
 852      _deprecated_function( __FUNCTION__, '2.1.0', 'get_option()' );
 853  
 854      return get_option($option);
 855  }
 856  
 857  /**
 858   * Print the permalink of the current post in the loop.
 859   *
 860   * @since 0.71
 861   * @deprecated 1.2.0 Use the_permalink()
 862   * @see the_permalink()
 863   */
 864  function permalink_link() {
 865      _deprecated_function( __FUNCTION__, '1.2.0', 'the_permalink()' );
 866      the_permalink();
 867  }
 868  
 869  /**
 870   * Print the permalink to the RSS feed.
 871   *
 872   * @since 0.71
 873   * @deprecated 2.3.0 Use the_permalink_rss()
 874   * @see the_permalink_rss()
 875   *
 876   * @param string $deprecated
 877   */
 878  function permalink_single_rss($deprecated = '') {
 879      _deprecated_function( __FUNCTION__, '2.3.0', 'the_permalink_rss()' );
 880      the_permalink_rss();
 881  }
 882  
 883  /**
 884   * Gets the links associated with category.
 885   *
 886   * @since 1.0.1
 887   * @deprecated 2.1.0 Use wp_list_bookmarks()
 888   * @see wp_list_bookmarks()
 889   *
 890   * @param string $args a query string
 891   * @return null|string
 892   */
 893  function wp_get_links($args = '') {
 894      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' );
 895  
 896      if ( ! str_contains( $args, '=' ) ) {
 897          $cat_id = $args;
 898          $args = add_query_arg( 'category', $cat_id, $args );
 899      }
 900  
 901      $defaults = array(
 902          'after' => '<br />',
 903          'before' => '',
 904          'between' => ' ',
 905          'categorize' => 0,
 906          'category' => '',
 907          'echo' => true,
 908          'limit' => -1,
 909          'orderby' => 'name',
 910          'show_description' => true,
 911          'show_images' => true,
 912          'show_rating' => false,
 913          'show_updated' => true,
 914          'title_li' => '',
 915      );
 916  
 917      $parsed_args = wp_parse_args( $args, $defaults );
 918  
 919      return wp_list_bookmarks($parsed_args);
 920  }
 921  
 922  /**
 923   * Gets the links associated with category by ID.
 924   *
 925   * @since 0.71
 926   * @deprecated 2.1.0 Use get_bookmarks()
 927   * @see get_bookmarks()
 928   *
 929   * @param int    $category         Optional. The category to use. If no category supplied uses all.
 930   *                                 Default 0.
 931   * @param string $before           Optional. The HTML to output before the link. Default empty.
 932   * @param string $after            Optional. The HTML to output after the link. Default '<br />'.
 933   * @param string $between          Optional. The HTML to output between the link/image and its description.
 934   *                                 Not used if no image or $show_images is true. Default ' '.
 935   * @param bool   $show_images      Optional. Whether to show images (if defined). Default true.
 936   * @param string $orderby          Optional. The order to output the links. E.g. 'id', 'name', 'url',
 937   *                                 'description', 'rating', or 'owner'. Default 'name'.
 938   *                                 If you start the name with an underscore, the order will be reversed.
 939   *                                 Specifying 'rand' as the order will return links in a random order.
 940   * @param bool   $show_description Optional. Whether to show the description if show_images=false/not defined.
 941   *                                 Default true.
 942   * @param bool   $show_rating      Optional. Show rating stars/chars. Default false.
 943   * @param int    $limit            Optional. Limit to X entries. If not specified, all entries are shown.
 944   *                                 Default -1.
 945   * @param int    $show_updated     Optional. Whether to show last updated timestamp. Default 1.
 946   * @param bool   $display          Whether to display the results, or return them instead.
 947   * @return null|string
 948   */
 949  function get_links($category = -1, $before = '', $after = '<br />', $between = ' ', $show_images = true, $orderby = 'name',
 950              $show_description = true, $show_rating = false, $limit = -1, $show_updated = 1, $display = true) {
 951      _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' );
 952  
 953      $order = 'ASC';
 954      if ( str_starts_with($orderby, '_') ) {
 955          $order = 'DESC';
 956          $orderby = substr($orderby, 1);
 957      }
 958  
 959      if ( $category == -1 ) // get_bookmarks() uses '' to signify all categories.
 960          $category = '';
 961  
 962      $results = get_bookmarks(array('category' => $category, 'orderby' => $orderby, 'order' => $order, 'show_updated' => $show_updated, 'limit' => $limit));
 963  
 964      if ( !$results )
 965          return;
 966  
 967      $output = '';
 968  
 969      foreach ( (array) $results as $row ) {
 970          if ( !isset($row->recently_updated) )
 971              $row->recently_updated = false;
 972          $output .= $before;
 973          if ( $show_updated && $row->recently_updated )
 974              $output .= get_option('links_recently_updated_prepend');
 975          $the_link = '#';
 976          if ( !empty($row->link_url) )
 977              $the_link = esc_url($row->link_url);
 978          $rel = $row->link_rel;
 979          if ( '' != $rel )
 980              $rel = ' rel="' . $rel . '"';
 981  
 982          $desc = esc_attr(sanitize_bookmark_field('link_description', $row->link_description, $row->link_id, 'display'));
 983          $name = esc_attr(sanitize_bookmark_field('link_name', $row->link_name, $row->link_id, 'display'));
 984          $title = $desc;
 985  
 986          if ( $show_updated )
 987              if ( !str_starts_with($row->link_updated_f, '00') )
 988                  $title .= ' ('.__('Last updated') . ' ' . gmdate(get_option('links_updated_date_format'), $row->link_updated_f + (get_option('gmt_offset') * HOUR_IN_SECONDS)) . ')';
 989  
 990          if ( '' != $title )
 991              $title = ' title="' . $title . '"';
 992  
 993          $alt = ' alt="' . $name . '"';
 994  
 995          $target = $row->link_target;
 996          if ( '' != $target )
 997              $target = ' target="' . $target . '"';
 998  
 999          $output .= '<a href="' . $the_link . '"' . $rel . $title . $target. '>';
1000  
1001          if ( '' != $row->link_image && $show_images ) {
1002              if ( str_contains( $row->link_image, 'http' ) )
1003                  $output .= '<img src="' . $row->link_image . '"' . $alt . $title . ' />';
1004              else // If it's a relative path.
1005                  $output .= '<img src="' . get_option('siteurl') . $row->link_image . '"' . $alt . $title . ' />';
1006          } else {
1007              $output .= $name;
1008          }
1009  
1010          $output .= '</a>';
1011  
1012          if ( $show_updated && $row->recently_updated )
1013              $output .= get_option('links_recently_updated_append');
1014  
1015          if ( $show_description && '' != $desc )
1016              $output .= $between . $desc;
1017  
1018          if ($show_rating) {
1019              $output .= $between . get_linkrating($row);
1020          }
1021  
1022          $output .= "$after\n";
1023      } // End while.
1024  
1025      if ( !$display )
1026          return $output;
1027      echo $output;
1028  }
1029  
1030  /**
1031   * Output entire list of links by category.
1032   *
1033   * Output a list of all links, listed by category, using the settings in
1034   * $wpdb->linkcategories and output it as a nested HTML unordered list.
1035   *
1036   * @since 1.0.1
1037   * @deprecated 2.1.0 Use wp_list_bookmarks()
1038   * @see wp_list_bookmarks()
1039   *
1040   * @param string $order Sort link categories by 'name' or 'id'
1041   */
1042  function get_links_list($order = 'name') {
1043      _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' );
1044  
1045      $order = strtolower($order);
1046  
1047      // Handle link category sorting.
1048      $direction = 'ASC';
1049      if ( str_starts_with( $order, '_' ) ) {
1050          $direction = 'DESC';
1051          $order = substr($order,1);
1052      }
1053  
1054      if ( !isset($direction) )
1055          $direction = '';
1056  
1057      $cats = get_categories(array('type' => 'link', 'orderby' => $order, 'order' => $direction, 'hierarchical' => 0));
1058  
1059      // Display each category.
1060      if ( $cats ) {
1061          foreach ( (array) $cats as $cat ) {
1062              // Handle each category.
1063  
1064              // Display the category name.
1065              /** This filter is documented in wp-includes/bookmark-template.php */
1066              echo '  <li id="linkcat-' . $cat->term_id . '" class="linkcat"><h2>' . apply_filters('link_category', $cat->name ) . "</h2>\n\t<ul>\n";
1067              // Call get_links() with all the appropriate params.
1068              get_links($cat->term_id, '<li>', "</li>", "\n", true, 'name', false);
1069  
1070              // Close the last category.
1071              echo "\n\t</ul>\n</li>\n";
1072          }
1073      }
1074  }
1075  
1076  /**
1077   * Show the link to the links popup and the number of links.
1078   *
1079   * @since 0.71
1080   * @deprecated 2.1.0
1081   *
1082   * @param string $text the text of the link
1083   * @param int $width the width of the popup window
1084   * @param int $height the height of the popup window
1085   * @param string $file the page to open in the popup window
1086   * @param bool $count the number of links in the db
1087   */
1088  function links_popup_script($text = 'Links', $width=400, $height=400, $file='links.all.php', $count = true) {
1089      _deprecated_function( __FUNCTION__, '2.1.0' );
1090  }
1091  
1092  /**
1093   * Legacy function that retrieved the value of a link's link_rating field.
1094   *
1095   * @since 1.0.1
1096   * @deprecated 2.1.0 Use sanitize_bookmark_field()
1097   * @see sanitize_bookmark_field()
1098   *
1099   * @param object $link Link object.
1100   * @return mixed Value of the 'link_rating' field, false otherwise.
1101   */
1102  function get_linkrating( $link ) {
1103      _deprecated_function( __FUNCTION__, '2.1.0', 'sanitize_bookmark_field()' );
1104      return sanitize_bookmark_field('link_rating', $link->link_rating, $link->link_id, 'display');
1105  }
1106  
1107  /**
1108   * Gets the name of category by ID.
1109   *
1110   * @since 0.71
1111   * @deprecated 2.1.0 Use get_category()
1112   * @see get_category()
1113   *
1114   * @param int $id The category to get. If no category supplied uses 0
1115   * @return string
1116   */
1117  function get_linkcatname($id = 0) {
1118      _deprecated_function( __FUNCTION__, '2.1.0', 'get_category()' );
1119  
1120      $id = (int) $id;
1121  
1122      if ( empty($id) )
1123          return '';
1124  
1125      $cats = wp_get_link_cats($id);
1126  
1127      if ( empty($cats) || ! is_array($cats) )
1128          return '';
1129  
1130      $cat_id = (int) $cats[0]; // Take the first cat.
1131  
1132      $cat = get_category($cat_id);
1133      return $cat->name;
1134  }
1135  
1136  /**
1137   * Print RSS comment feed link.
1138   *
1139   * @since 1.0.1
1140   * @deprecated 2.5.0 Use post_comments_feed_link()
1141   * @see post_comments_feed_link()
1142   *
1143   * @param string $link_text
1144   */
1145  function comments_rss_link($link_text = 'Comments RSS') {
1146      _deprecated_function( __FUNCTION__, '2.5.0', 'post_comments_feed_link()' );
1147      post_comments_feed_link($link_text);
1148  }
1149  
1150  /**
1151   * Print/Return link to category RSS2 feed.
1152   *
1153   * @since 1.2.0
1154   * @deprecated 2.5.0 Use get_category_feed_link()
1155   * @see get_category_feed_link()
1156   *
1157   * @param bool $display
1158   * @param int $cat_id
1159   * @return string
1160   */
1161  function get_category_rss_link($display = false, $cat_id = 1) {
1162      _deprecated_function( __FUNCTION__, '2.5.0', 'get_category_feed_link()' );
1163  
1164      $link = get_category_feed_link($cat_id, 'rss2');
1165  
1166      if ( $display )
1167          echo $link;
1168      return $link;
1169  }
1170  
1171  /**
1172   * Print/Return link to author RSS feed.
1173   *
1174   * @since 1.2.0
1175   * @deprecated 2.5.0 Use get_author_feed_link()
1176   * @see get_author_feed_link()
1177   *
1178   * @param bool $display
1179   * @param int $author_id
1180   * @return string
1181   */
1182  function get_author_rss_link($display = false, $author_id = 1) {
1183      _deprecated_function( __FUNCTION__, '2.5.0', 'get_author_feed_link()' );
1184  
1185      $link = get_author_feed_link($author_id);
1186      if ( $display )
1187          echo $link;
1188      return $link;
1189  }
1190  
1191  /**
1192   * Return link to the post RSS feed.
1193   *
1194   * @since 1.5.0
1195   * @deprecated 2.2.0 Use get_post_comments_feed_link()
1196   * @see get_post_comments_feed_link()
1197   *
1198   * @return string
1199   */
1200  function comments_rss() {
1201      _deprecated_function( __FUNCTION__, '2.2.0', 'get_post_comments_feed_link()' );
1202      return esc_url( get_post_comments_feed_link() );
1203  }
1204  
1205  /**
1206   * An alias of wp_create_user().
1207   *
1208   * @since 2.0.0
1209   * @deprecated 2.0.0 Use wp_create_user()
1210   * @see wp_create_user()
1211   *
1212   * @param string $username The user's username.
1213   * @param string $password The user's password.
1214   * @param string $email    The user's email.
1215   * @return int The new user's ID.
1216   */
1217  function create_user($username, $password, $email) {
1218      _deprecated_function( __FUNCTION__, '2.0.0', 'wp_create_user()' );
1219      return wp_create_user($username, $password, $email);
1220  }
1221  
1222  /**
1223   * Unused function.
1224   *
1225   * @deprecated 2.5.0
1226   */
1227  function gzip_compression() {
1228      _deprecated_function( __FUNCTION__, '2.5.0' );
1229      return false;
1230  }
1231  
1232  /**
1233   * Retrieve an array of comment data about comment $comment_id.
1234   *
1235   * @since 0.71
1236   * @deprecated 2.7.0 Use get_comment()
1237   * @see get_comment()
1238   *
1239   * @param int $comment_id The ID of the comment
1240   * @param int $no_cache Whether to use the cache (cast to bool)
1241   * @param bool $include_unapproved Whether to include unapproved comments
1242   * @return array The comment data
1243   */
1244  function get_commentdata( $comment_id, $no_cache = 0, $include_unapproved = false ) {
1245      _deprecated_function( __FUNCTION__, '2.7.0', 'get_comment()' );
1246      return get_comment($comment_id, ARRAY_A);
1247  }
1248  
1249  /**
1250   * Retrieve the category name by the category ID.
1251   *
1252   * @since 0.71
1253   * @deprecated 2.8.0 Use get_cat_name()
1254   * @see get_cat_name()
1255   *
1256   * @param int $cat_id Category ID
1257   * @return string category name
1258   */
1259  function get_catname( $cat_id ) {
1260      _deprecated_function( __FUNCTION__, '2.8.0', 'get_cat_name()' );
1261      return get_cat_name( $cat_id );
1262  }
1263  
1264  /**
1265   * Retrieve category children list separated before and after the term IDs.
1266   *
1267   * @since 1.2.0
1268   * @deprecated 2.8.0 Use get_term_children()
1269   * @see get_term_children()
1270   *
1271   * @param int    $id      Category ID to retrieve children.
1272   * @param string $before  Optional. Prepend before category term ID. Default '/'.
1273   * @param string $after   Optional. Append after category term ID. Default empty string.
1274   * @param array  $visited Optional. Category Term IDs that have already been added.
1275   *                        Default empty array.
1276   * @return string
1277   */
1278  function get_category_children( $id, $before = '/', $after = '', $visited = array() ) {
1279      _deprecated_function( __FUNCTION__, '2.8.0', 'get_term_children()' );
1280      if ( 0 == $id )
1281          return '';
1282  
1283      $chain = '';
1284      /** TODO: Consult hierarchy */
1285      $cat_ids = get_all_category_ids();
1286      foreach ( (array) $cat_ids as $cat_id ) {
1287          if ( $cat_id == $id )
1288              continue;
1289  
1290          $category = get_category( $cat_id );
1291          if ( is_wp_error( $category ) )
1292              return $category;
1293          if ( $category->parent == $id && !in_array( $category->term_id, $visited ) ) {
1294              $visited[] = $category->term_id;
1295              $chain .= $before.$category->term_id.$after;
1296              $chain .= get_category_children( $category->term_id, $before, $after );
1297          }
1298      }
1299      return $chain;
1300  }
1301  
1302  /**
1303   * Retrieves all category IDs.
1304   *
1305   * @since 2.0.0
1306   * @deprecated 4.0.0 Use get_terms()
1307   * @see get_terms()
1308   *
1309   * @link https://developer.wordpress.org/reference/functions/get_all_category_ids/
1310   *
1311   * @return int[] List of all of the category IDs.
1312   */
1313  function get_all_category_ids() {
1314      _deprecated_function( __FUNCTION__, '4.0.0', 'get_terms()' );
1315  
1316      $cat_ids = get_terms(
1317          array(
1318              'taxonomy' => 'category',
1319              'fields'   => 'ids',
1320              'get'      => 'all',
1321          )
1322      );
1323  
1324      return $cat_ids;
1325  }
1326  
1327  /**
1328   * Retrieve the description of the author of the current post.
1329   *
1330   * @since 1.5.0
1331   * @deprecated 2.8.0 Use get_the_author_meta()
1332   * @see get_the_author_meta()
1333   *
1334   * @return string The author's description.
1335   */
1336  function get_the_author_description() {
1337      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'description\')' );
1338      return get_the_author_meta('description');
1339  }
1340  
1341  /**
1342   * Display the description of the author of the current post.
1343   *
1344   * @since 1.0.0
1345   * @deprecated 2.8.0 Use the_author_meta()
1346   * @see the_author_meta()
1347   */
1348  function the_author_description() {
1349      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'description\')' );
1350      the_author_meta('description');
1351  }
1352  
1353  /**
1354   * Retrieve the login name of the author of the current post.
1355   *
1356   * @since 1.5.0
1357   * @deprecated 2.8.0 Use get_the_author_meta()
1358   * @see get_the_author_meta()
1359   *
1360   * @return string The author's login name (username).
1361   */
1362  function get_the_author_login() {
1363      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'login\')' );
1364      return get_the_author_meta('login');
1365  }
1366  
1367  /**
1368   * Display the login name of the author of the current post.
1369   *
1370   * @since 0.71
1371   * @deprecated 2.8.0 Use the_author_meta()
1372   * @see the_author_meta()
1373   */
1374  function the_author_login() {
1375      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'login\')' );
1376      the_author_meta('login');
1377  }
1378  
1379  /**
1380   * Retrieve the first name of the author of the current post.
1381   *
1382   * @since 1.5.0
1383   * @deprecated 2.8.0 Use get_the_author_meta()
1384   * @see get_the_author_meta()
1385   *
1386   * @return string The author's first name.
1387   */
1388  function get_the_author_firstname() {
1389      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'first_name\')' );
1390      return get_the_author_meta('first_name');
1391  }
1392  
1393  /**
1394   * Display the first name of the author of the current post.
1395   *
1396   * @since 0.71
1397   * @deprecated 2.8.0 Use the_author_meta()
1398   * @see the_author_meta()
1399   */
1400  function the_author_firstname() {
1401      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'first_name\')' );
1402      the_author_meta('first_name');
1403  }
1404  
1405  /**
1406   * Retrieve the last name of the author of the current post.
1407   *
1408   * @since 1.5.0
1409   * @deprecated 2.8.0 Use get_the_author_meta()
1410   * @see get_the_author_meta()
1411   *
1412   * @return string The author's last name.
1413   */
1414  function get_the_author_lastname() {
1415      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'last_name\')' );
1416      return get_the_author_meta('last_name');
1417  }
1418  
1419  /**
1420   * Display the last name of the author of the current post.
1421   *
1422   * @since 0.71
1423   * @deprecated 2.8.0 Use the_author_meta()
1424   * @see the_author_meta()
1425   */
1426  function the_author_lastname() {
1427      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'last_name\')' );
1428      the_author_meta('last_name');
1429  }
1430  
1431  /**
1432   * Retrieve the nickname of the author of the current post.
1433   *
1434   * @since 1.5.0
1435   * @deprecated 2.8.0 Use get_the_author_meta()
1436   * @see get_the_author_meta()
1437   *
1438   * @return string The author's nickname.
1439   */
1440  function get_the_author_nickname() {
1441      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'nickname\')' );
1442      return get_the_author_meta('nickname');
1443  }
1444  
1445  /**
1446   * Display the nickname of the author of the current post.
1447   *
1448   * @since 0.71
1449   * @deprecated 2.8.0 Use the_author_meta()
1450   * @see the_author_meta()
1451   */
1452  function the_author_nickname() {
1453      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'nickname\')' );
1454      the_author_meta('nickname');
1455  }
1456  
1457  /**
1458   * Retrieve the email of the author of the current post.
1459   *
1460   * @since 1.5.0
1461   * @deprecated 2.8.0 Use get_the_author_meta()
1462   * @see get_the_author_meta()
1463   *
1464   * @return string The author's username.
1465   */
1466  function get_the_author_email() {
1467      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'email\')' );
1468      return get_the_author_meta('email');
1469  }
1470  
1471  /**
1472   * Display the email of the author of the current post.
1473   *
1474   * @since 0.71
1475   * @deprecated 2.8.0 Use the_author_meta()
1476   * @see the_author_meta()
1477   */
1478  function the_author_email() {
1479      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'email\')' );
1480      the_author_meta('email');
1481  }
1482  
1483  /**
1484   * Retrieve the ICQ number of the author of the current post.
1485   *
1486   * @since 1.5.0
1487   * @deprecated 2.8.0 Use get_the_author_meta()
1488   * @see get_the_author_meta()
1489   *
1490   * @return string The author's ICQ number.
1491   */
1492  function get_the_author_icq() {
1493      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'icq\')' );
1494      return get_the_author_meta('icq');
1495  }
1496  
1497  /**
1498   * Display the ICQ number of the author of the current post.
1499   *
1500   * @since 0.71
1501   * @deprecated 2.8.0 Use the_author_meta()
1502   * @see the_author_meta()
1503   */
1504  function the_author_icq() {
1505      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'icq\')' );
1506      the_author_meta('icq');
1507  }
1508  
1509  /**
1510   * Retrieve the Yahoo! IM name of the author of the current post.
1511   *
1512   * @since 1.5.0
1513   * @deprecated 2.8.0 Use get_the_author_meta()
1514   * @see get_the_author_meta()
1515   *
1516   * @return string The author's Yahoo! IM name.
1517   */
1518  function get_the_author_yim() {
1519      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'yim\')' );
1520      return get_the_author_meta('yim');
1521  }
1522  
1523  /**
1524   * Display the Yahoo! IM name of the author of the current post.
1525   *
1526   * @since 0.71
1527   * @deprecated 2.8.0 Use the_author_meta()
1528   * @see the_author_meta()
1529   */
1530  function the_author_yim() {
1531      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'yim\')' );
1532      the_author_meta('yim');
1533  }
1534  
1535  /**
1536   * Retrieve the MSN address of the author of the current post.
1537   *
1538   * @since 1.5.0
1539   * @deprecated 2.8.0 Use get_the_author_meta()
1540   * @see get_the_author_meta()
1541   *
1542   * @return string The author's MSN address.
1543   */
1544  function get_the_author_msn() {
1545      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'msn\')' );
1546      return get_the_author_meta('msn');
1547  }
1548  
1549  /**
1550   * Display the MSN address of the author of the current post.
1551   *
1552   * @since 0.71
1553   * @deprecated 2.8.0 Use the_author_meta()
1554   * @see the_author_meta()
1555   */
1556  function the_author_msn() {
1557      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'msn\')' );
1558      the_author_meta('msn');
1559  }
1560  
1561  /**
1562   * Retrieve the AIM address of the author of the current post.
1563   *
1564   * @since 1.5.0
1565   * @deprecated 2.8.0 Use get_the_author_meta()
1566   * @see get_the_author_meta()
1567   *
1568   * @return string The author's AIM address.
1569   */
1570  function get_the_author_aim() {
1571      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'aim\')' );
1572      return get_the_author_meta('aim');
1573  }
1574  
1575  /**
1576   * Display the AIM address of the author of the current post.
1577   *
1578   * @since 0.71
1579   * @deprecated 2.8.0 Use the_author_meta('aim')
1580   * @see the_author_meta()
1581   */
1582  function the_author_aim() {
1583      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'aim\')' );
1584      the_author_meta('aim');
1585  }
1586  
1587  /**
1588   * Retrieve the specified author's preferred display name.
1589   *
1590   * @since 1.0.0
1591   * @deprecated 2.8.0 Use get_the_author_meta()
1592   * @see get_the_author_meta()
1593   *
1594   * @param int $auth_id The ID of the author.
1595   * @return string The author's display name.
1596   */
1597  function get_author_name( $auth_id = false ) {
1598      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'display_name\')' );
1599      return get_the_author_meta('display_name', $auth_id);
1600  }
1601  
1602  /**
1603   * Retrieve the URL to the home page of the author of the current post.
1604   *
1605   * @since 1.5.0
1606   * @deprecated 2.8.0 Use get_the_author_meta()
1607   * @see get_the_author_meta()
1608   *
1609   * @return string The URL to the author's page.
1610   */
1611  function get_the_author_url() {
1612      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'url\')' );
1613      return get_the_author_meta('url');
1614  }
1615  
1616  /**
1617   * Display the URL to the home page of the author of the current post.
1618   *
1619   * @since 0.71
1620   * @deprecated 2.8.0 Use the_author_meta()
1621   * @see the_author_meta()
1622   */
1623  function the_author_url() {
1624      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'url\')' );
1625      the_author_meta('url');
1626  }
1627  
1628  /**
1629   * Retrieve the ID of the author of the current post.
1630   *
1631   * @since 1.5.0
1632   * @deprecated 2.8.0 Use get_the_author_meta()
1633   * @see get_the_author_meta()
1634   *
1635   * @return string|int The author's ID.
1636   */
1637  function get_the_author_ID() {
1638      _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'ID\')' );
1639      return get_the_author_meta('ID');
1640  }
1641  
1642  /**
1643   * Display the ID of the author of the current post.
1644   *
1645   * @since 0.71
1646   * @deprecated 2.8.0 Use the_author_meta()
1647   * @see the_author_meta()
1648   */
1649  function the_author_ID() {
1650      _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'ID\')' );
1651      the_author_meta('ID');
1652  }
1653  
1654  /**
1655   * Display the post content for the feed.
1656   *
1657   * For encoding the HTML or the $encode_html parameter, there are three possible values:
1658   * - '0' will make urls footnotes and use make_url_footnote().
1659   * - '1' will encode special characters and automatically display all of the content.
1660   * - '2' will strip all HTML tags from the content.
1661   *
1662   * Also note that you cannot set the amount of words and not set the HTML encoding.
1663   * If that is the case, then the HTML encoding will default to 2, which will strip
1664   * all HTML tags.
1665   *
1666   * To restrict the amount of words of the content, you can use the cut parameter.
1667   * If the content is less than the amount, then there won't be any dots added to the end.
1668   * If there is content left over, then dots will be added and the rest of the content
1669   * will be removed.
1670   *
1671   * @since 0.71
1672   *
1673   * @deprecated 2.9.0 Use the_content_feed()
1674   * @see the_content_feed()
1675   *
1676   * @param string $more_link_text Optional. Text to display when more content is available
1677   *                               but not displayed. Default '(more...)'.
1678   * @param int    $stripteaser    Optional. Default 0.
1679   * @param string $more_file      Optional.
1680   * @param int    $cut            Optional. Amount of words to keep for the content.
1681   * @param int    $encode_html    Optional. How to encode the content.
1682   */
1683  function the_content_rss($more_link_text='(more...)', $stripteaser=0, $more_file='', $cut = 0, $encode_html = 0) {
1684      _deprecated_function( __FUNCTION__, '2.9.0', 'the_content_feed()' );
1685      $content = get_the_content($more_link_text, $stripteaser);
1686  
1687      /**
1688       * Filters the post content in the context of an RSS feed.
1689       *
1690       * @since 0.71
1691       *
1692       * @param string $content Content of the current post.
1693       */
1694      $content = apply_filters('the_content_rss', $content);
1695      if ( $cut && !$encode_html )
1696          $encode_html = 2;
1697      if ( 1== $encode_html ) {
1698          $content = esc_html($content);
1699          $cut = 0;
1700      } elseif ( 0 == $encode_html ) {
1701          $content = make_url_footnote($content);
1702      } elseif ( 2 == $encode_html ) {
1703          $content = strip_tags($content);
1704      }
1705      if ( $cut ) {
1706          $blah = explode(' ', $content);
1707          if ( count($blah) > $cut ) {
1708              $k = $cut;
1709              $use_dotdotdot = 1;
1710          } else {
1711              $k = count($blah);
1712              $use_dotdotdot = 0;
1713          }
1714  
1715          /** @todo Check performance, might be faster to use array slice instead. */
1716          for ( $i=0; $i<$k; $i++ )
1717              $excerpt .= $blah[$i].' ';
1718          $excerpt .= ($use_dotdotdot) ? '...' : '';
1719          $content = $excerpt;
1720      }
1721      $content = str_replace(']]>', ']]&gt;', $content);
1722      echo $content;
1723  }
1724  
1725  /**
1726   * Strip HTML and put links at the bottom of stripped content.
1727   *
1728   * Searches for all of the links, strips them out of the content, and places
1729   * them at the bottom of the content with numbers.
1730   *
1731   * @since 0.71
1732   * @deprecated 2.9.0
1733   *
1734   * @param string $content Content to get links.
1735   * @return string HTML stripped out of content with links at the bottom.
1736   */
1737  function make_url_footnote( $content ) {
1738      _deprecated_function( __FUNCTION__, '2.9.0', '' );
1739      preg_match_all( '/<a(.+?)href=\"(.+?)\"(.*?)>(.+?)<\/a>/', $content, $matches );
1740      $links_summary = "\n";
1741      for ( $i = 0, $c = count( $matches[0] ); $i < $c; $i++ ) {
1742          $link_match = $matches[0][$i];
1743          $link_number = '['.($i+1).']';
1744          $link_url = $matches[2][$i];
1745          $link_text = $matches[4][$i];
1746          $content = str_replace( $link_match, $link_text . ' ' . $link_number, $content );
1747          $link_url = ( ( strtolower( substr( $link_url, 0, 7 ) ) !== 'http://' ) && ( strtolower( substr( $link_url, 0, 8 ) ) !== 'https://' ) ) ? get_option( 'home' ) . $link_url : $link_url;
1748          $links_summary .= "\n" . $link_number . ' ' . $link_url;
1749      }
1750      $content  = strip_tags( $content );
1751      $content .= $links_summary;
1752      return $content;
1753  }
1754  
1755  /**
1756   * Retrieve translated string with vertical bar context
1757   *
1758   * Quite a few times, there will be collisions with similar translatable text
1759   * found in more than two places but with different translated context.
1760   *
1761   * In order to use the separate contexts, the _c() function is used and the
1762   * translatable string uses a pipe ('|') which has the context the string is in.
1763   *
1764   * When the translated string is returned, it is everything before the pipe, not
1765   * including the pipe character. If there is no pipe in the translated text then
1766   * everything is returned.
1767   *
1768   * @since 2.2.0
1769   * @deprecated 2.9.0 Use _x()
1770   * @see _x()
1771   *
1772   * @param string $text Text to translate.
1773   * @param string $domain Optional. Domain to retrieve the translated text.
1774   * @return string Translated context string without pipe.
1775   */
1776  function _c( $text, $domain = 'default' ) {
1777      _deprecated_function( __FUNCTION__, '2.9.0', '_x()' );
1778      return before_last_bar( translate( $text, $domain ) );
1779  }
1780  
1781  /**
1782   * Translates $text like translate(), but assumes that the text
1783   * contains a context after its last vertical bar.
1784   *
1785   * @since 2.5.0
1786   * @deprecated 3.0.0 Use _x()
1787   * @see _x()
1788   *
1789   * @param string $text Text to translate.
1790   * @param string $domain Domain to retrieve the translated text.
1791   * @return string Translated text.
1792   */
1793  function translate_with_context( $text, $domain = 'default' ) {
1794      _deprecated_function( __FUNCTION__, '2.9.0', '_x()' );
1795      return before_last_bar( translate( $text, $domain ) );
1796  }
1797  
1798  /**
1799   * Legacy version of _n(), which supports contexts.
1800   *
1801   * Strips everything from the translation after the last bar.
1802   *
1803   * @since 2.7.0
1804   * @deprecated 3.0.0 Use _nx()
1805   * @see _nx()
1806   *
1807   * @param string $single The text to be used if the number is singular.
1808   * @param string $plural The text to be used if the number is plural.
1809   * @param int    $number The number to compare against to use either the singular or plural form.
1810   * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.
1811   *                       Default 'default'.
1812   * @return string The translated singular or plural form.
1813   */
1814  function _nc( $single, $plural, $number, $domain = 'default' ) {
1815      _deprecated_function( __FUNCTION__, '2.9.0', '_nx()' );
1816      return before_last_bar( _n( $single, $plural, $number, $domain ) );
1817  }
1818  
1819  /**
1820   * Retrieve the plural or single form based on the amount.
1821   *
1822   * @since 1.2.0
1823   * @deprecated 2.8.0 Use _n()
1824   * @see _n()
1825   */
1826  function __ngettext( ...$args ) {
1827      _deprecated_function( __FUNCTION__, '2.8.0', '_n()' );
1828      return _n( ...$args );
1829  }
1830  
1831  /**
1832   * Register plural strings in POT file, but don't translate them.
1833   *
1834   * @since 2.5.0
1835   * @deprecated 2.8.0 Use _n_noop()
1836   * @see _n_noop()
1837   */
1838  function __ngettext_noop( ...$args ) {
1839      _deprecated_function( __FUNCTION__, '2.8.0', '_n_noop()' );
1840      return _n_noop( ...$args );
1841  
1842  }
1843  
1844  /**
1845   * Retrieve all autoload options, or all options if no autoloaded ones exist.
1846   *
1847   * @since 1.0.0
1848   * @deprecated 3.0.0 Use wp_load_alloptions())
1849   * @see wp_load_alloptions()
1850   *
1851   * @return array List of all options.
1852   */
1853  function get_alloptions() {
1854      _deprecated_function( __FUNCTION__, '3.0.0', 'wp_load_alloptions()' );
1855      return wp_load_alloptions();
1856  }
1857  
1858  /**
1859   * Retrieve HTML content of attachment image with link.
1860   *
1861   * @since 2.0.0
1862   * @deprecated 2.5.0 Use wp_get_attachment_link()
1863   * @see wp_get_attachment_link()
1864   *
1865   * @param int   $id       Optional. Post ID.
1866   * @param bool  $fullsize Optional. Whether to use full size image. Default false.
1867   * @param array $max_dims Optional. Max image dimensions.
1868   * @param bool $permalink Optional. Whether to include permalink to image. Default false.
1869   * @return string
1870   */
1871  function get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false, $permalink = false) {
1872      _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_link()' );
1873      $id = (int) $id;
1874      $_post = get_post($id);
1875  
1876      if ( ('attachment' != $_post->post_type) || !$url = wp_get_attachment_url($_post->ID) )
1877          return __('Missing Attachment');
1878  
1879      if ( $permalink )
1880          $url = get_attachment_link($_post->ID);
1881  
1882      $post_title = esc_attr($_post->post_title);
1883  
1884      $innerHTML = get_attachment_innerHTML($_post->ID, $fullsize, $max_dims);
1885      return "<a href='$url' title='$post_title'>$innerHTML</a>";
1886  }
1887  
1888  /**
1889   * Retrieve icon URL and Path.
1890   *
1891   * @since 2.1.0
1892   * @deprecated 2.5.0 Use wp_get_attachment_image_src()
1893   * @see wp_get_attachment_image_src()
1894   *
1895   * @param int  $id       Optional. Post ID.
1896   * @param bool $fullsize Optional. Whether to have full image. Default false.
1897   * @return array Icon URL and full path to file, respectively.
1898   */
1899  function get_attachment_icon_src( $id = 0, $fullsize = false ) {
1900      _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image_src()' );
1901      $id = (int) $id;
1902      if ( !$post = get_post($id) )
1903          return false;
1904  
1905      $file = get_attached_file( $post->ID );
1906  
1907      if ( !$fullsize && $src = wp_get_attachment_thumb_url( $post->ID ) ) {
1908          // We have a thumbnail desired, specified and existing.
1909  
1910          $src_file = wp_basename($src);
1911      } elseif ( wp_attachment_is_image( $post->ID ) ) {
1912          // We have an image without a thumbnail.
1913  
1914          $src = wp_get_attachment_url( $post->ID );
1915          $src_file = & $file;
1916      } elseif ( $src = wp_mime_type_icon( $post->ID, '.svg' ) ) {
1917          // No thumb, no image. We'll look for a mime-related icon instead.
1918  
1919          /** This filter is documented in wp-includes/post.php */
1920          $icon_dir = apply_filters( 'icon_dir', get_template_directory() . '/images' );
1921          $src_file = $icon_dir . '/' . wp_basename($src);
1922      }
1923  
1924      if ( !isset($src) || !$src )
1925          return false;
1926  
1927      return array($src, $src_file);
1928  }
1929  
1930  /**
1931   * Retrieve HTML content of icon attachment image element.
1932   *
1933   * @since 2.0.0
1934   * @deprecated 2.5.0 Use wp_get_attachment_image()
1935   * @see wp_get_attachment_image()
1936   *
1937   * @param int   $id       Optional. Post ID.
1938   * @param bool  $fullsize Optional. Whether to have full size image. Default false.
1939   * @param array $max_dims Optional. Dimensions of image.
1940   * @return string|false HTML content.
1941   */
1942  function get_attachment_icon( $id = 0, $fullsize = false, $max_dims = false ) {
1943      _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' );
1944      $id = (int) $id;
1945      if ( !$post = get_post($id) )
1946          return false;
1947  
1948      if ( !$src = get_attachment_icon_src( $post->ID, $fullsize ) )
1949          return false;
1950  
1951      list($src, $src_file) = $src;
1952  
1953      // Do we need to constrain the image?
1954      if ( ($max_dims = apply_filters('attachment_max_dims', $max_dims)) && file_exists($src_file) ) {
1955  
1956          $imagesize = wp_getimagesize($src_file);
1957  
1958          if (($imagesize[0] > $max_dims[0]) || $imagesize[1] > $max_dims[1] ) {
1959              $actual_aspect = $imagesize[0] / $imagesize[1];
1960              $desired_aspect = $max_dims[0] / $max_dims[1];
1961  
1962              if ( $actual_aspect >= $desired_aspect ) {
1963                  $height = $actual_aspect * $max_dims[0];
1964                  $constraint = "width='{$max_dims[0]}' ";
1965                  $post->iconsize = array($max_dims[0], $height);
1966              } else {
1967                  $width = $max_dims[1] / $actual_aspect;
1968                  $constraint = "height='{$max_dims[1]}' ";
1969                  $post->iconsize = array($width, $max_dims[1]);
1970              }
1971          } else {
1972              $post->iconsize = array($imagesize[0], $imagesize[1]);
1973              $constraint = '';
1974          }
1975      } else {
1976          $constraint = '';
1977      }
1978  
1979      $post_title = esc_attr($post->post_title);
1980  
1981      $icon = "<img src='$src' title='$post_title' alt='$post_title' $constraint/>";
1982  
1983      return apply_filters( 'attachment_icon', $icon, $post->ID );
1984  }
1985  
1986  /**
1987   * Retrieve HTML content of image element.
1988   *
1989   * @since 2.0.0
1990   * @deprecated 2.5.0 Use wp_get_attachment_image()
1991   * @see wp_get_attachment_image()
1992   *
1993   * @param int   $id       Optional. Post ID.
1994   * @param bool  $fullsize Optional. Whether to have full size image. Default false.
1995   * @param array $max_dims Optional. Dimensions of image.
1996   * @return string|false
1997   */
1998  function get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) {
1999      _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' );
2000      $id = (int) $id;
2001      if ( !$post = get_post($id) )
2002          return false;
2003  
2004      if ( $innerHTML = get_attachment_icon($post->ID, $fullsize, $max_dims))
2005          return $innerHTML;
2006  
2007      $innerHTML = esc_attr($post->post_title);
2008  
2009      return apply_filters('attachment_innerHTML', $innerHTML, $post->ID);
2010  }
2011  
2012  /**
2013   * Retrieves bookmark data based on ID.
2014   *
2015   * @since 2.0.0
2016   * @deprecated 2.1.0 Use get_bookmark()
2017   * @see get_bookmark()
2018   *
2019   * @param int    $bookmark_id ID of link
2020   * @param string $output      Optional. Type of output. Accepts OBJECT, ARRAY_N, or ARRAY_A.
2021   *                            Default OBJECT.
2022   * @param string $filter      Optional. How to filter the link for output. Accepts 'raw', 'edit',
2023   *                            'attribute', 'js', 'db', or 'display'. Default 'raw'.
2024   * @return object|array Bookmark object or array, depending on the type specified by `$output`.
2025   */
2026  function get_link( $bookmark_id, $output = OBJECT, $filter = 'raw' ) {
2027      _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmark()' );
2028      return get_bookmark($bookmark_id, $output, $filter);
2029  }
2030  
2031  /**
2032   * Checks and cleans a URL.
2033   *
2034   * A number of characters are removed from the URL. If the URL is for displaying
2035   * (the default behavior) ampersands are also replaced. The 'clean_url' filter
2036   * is applied to the returned cleaned URL.
2037   *
2038   * @since 1.2.0
2039   * @deprecated 3.0.0 Use esc_url()
2040   * @see esc_url()
2041   *
2042   * @param string $url The URL to be cleaned.
2043   * @param array $protocols Optional. An array of acceptable protocols.
2044   * @param string $context Optional. How the URL will be used. Default is 'display'.
2045   * @return string The cleaned $url after the {@see 'clean_url'} filter is applied.
2046   */
2047  function clean_url( $url, $protocols = null, $context = 'display' ) {
2048      if ( $context == 'db' )
2049          _deprecated_function( 'clean_url( $context = \'db\' )', '3.0.0', 'sanitize_url()' );
2050      else
2051          _deprecated_function( __FUNCTION__, '3.0.0', 'esc_url()' );
2052      return esc_url( $url, $protocols, $context );
2053  }
2054  
2055  /**
2056   * Escape single quotes, specialchar double quotes, and fix line endings.
2057   *
2058   * The filter {@see 'js_escape'} is also applied by esc_js().
2059   *
2060   * @since 2.0.4
2061   * @deprecated 2.8.0 Use esc_js()
2062   * @see esc_js()
2063   *
2064   * @param string $text The text to be escaped.
2065   * @return string Escaped text.
2066   */
2067  function js_escape( $text ) {
2068      _deprecated_function( __FUNCTION__, '2.8.0', 'esc_js()' );
2069      return esc_js( $text );
2070  }
2071  
2072  /**
2073   * Legacy escaping for HTML blocks.
2074   *
2075   * @deprecated 2.8.0 Use esc_html()
2076   * @see esc_html()
2077   *
2078   * @param string       $text          Text to escape.
2079   * @param string       $quote_style   Unused.
2080   * @param false|string $charset       Unused.
2081   * @param false        $double_encode Whether to double encode. Unused.
2082   * @return string Escaped `$text`.
2083   */
2084  function wp_specialchars( $text, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) {
2085      _deprecated_function( __FUNCTION__, '2.8.0', 'esc_html()' );
2086      if ( func_num_args() > 1 ) { // Maintain back-compat for people passing additional arguments.
2087          return _wp_specialchars( $text, $quote_style, $charset, $double_encode );
2088      } else {
2089          return esc_html( $text );
2090      }
2091  }
2092  
2093  /**
2094   * Escaping for HTML attributes.
2095   *
2096   * @since 2.0.6
2097   * @deprecated 2.8.0 Use esc_attr()
2098   * @see esc_attr()
2099   *
2100   * @param string $text
2101   * @return string
2102   */
2103  function attribute_escape( $text ) {
2104      _deprecated_function( __FUNCTION__, '2.8.0', 'esc_attr()' );
2105      return esc_attr( $text );
2106  }
2107  
2108  /**
2109   * Register widget for sidebar with backward compatibility.
2110   *
2111   * Allows $name to be an array that accepts either three elements to grab the
2112   * first element and the third for the name or just uses the first element of
2113   * the array for the name.
2114   *
2115   * Passes to wp_register_sidebar_widget() after argument list and backward
2116   * compatibility is complete.
2117   *
2118   * @since 2.2.0
2119   * @deprecated 2.8.0 Use wp_register_sidebar_widget()
2120   * @see wp_register_sidebar_widget()
2121   *
2122   * @param string|int $name            Widget ID.
2123   * @param callable   $output_callback Run when widget is called.
2124   * @param string     $classname       Optional. Classname widget option. Default empty.
2125   * @param mixed      ...$params       Widget parameters.
2126   */
2127  function register_sidebar_widget($name, $output_callback, $classname = '', ...$params) {
2128      _deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_sidebar_widget()' );
2129      // Compat.
2130      if ( is_array( $name ) ) {
2131          if ( count( $name ) === 3 ) {
2132              $name = sprintf( $name[0], $name[2] );
2133          } else {
2134              $name = $name[0];
2135          }
2136      }
2137  
2138      $id      = sanitize_title( $name );
2139      $options = array();
2140      if ( ! empty( $classname ) && is_string( $classname ) ) {
2141          $options['classname'] = $classname;
2142      }
2143  
2144      wp_register_sidebar_widget( $id, $name, $output_callback, $options, ...$params );
2145  }
2146  
2147  /**
2148   * Serves as an alias of wp_unregister_sidebar_widget().
2149   *
2150   * @since 2.2.0
2151   * @deprecated 2.8.0 Use wp_unregister_sidebar_widget()
2152   * @see wp_unregister_sidebar_widget()
2153   *
2154   * @param int|string $id Widget ID.
2155   */
2156  function unregister_sidebar_widget($id) {
2157      _deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_sidebar_widget()' );
2158      return wp_unregister_sidebar_widget($id);
2159  }
2160  
2161  /**
2162   * Registers widget control callback for customizing options.
2163   *
2164   * Allows $name to be an array that accepts either three elements to grab the
2165   * first element and the third for the name or just uses the first element of
2166   * the array for the name.
2167   *
2168   * Passes to wp_register_widget_control() after the argument list has
2169   * been compiled.
2170   *
2171   * @since 2.2.0
2172   * @deprecated 2.8.0 Use wp_register_widget_control()
2173   * @see wp_register_widget_control()
2174   *
2175   * @param int|string $name             Sidebar ID.
2176   * @param callable   $control_callback Widget control callback to display and process form.
2177   * @param int        $width            Widget width.
2178   * @param int        $height           Widget height.
2179   * @param mixed      ...$params        Widget parameters.
2180   */
2181  function register_widget_control($name, $control_callback, $width = '', $height = '', ...$params) {
2182      _deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_widget_control()' );
2183      // Compat.
2184      if ( is_array( $name ) ) {
2185          if ( count( $name ) === 3 ) {
2186              $name = sprintf( $name[0], $name[2] );
2187          } else {
2188              $name = $name[0];
2189          }
2190      }
2191  
2192      $id      = sanitize_title( $name );
2193      $options = array();
2194      if ( ! empty( $width ) ) {
2195          $options['width'] = $width;
2196      }
2197      if ( ! empty( $height ) ) {
2198          $options['height'] = $height;
2199      }
2200  
2201      wp_register_widget_control( $id, $name, $control_callback, $options, ...$params );
2202  }
2203  
2204  /**
2205   * Alias of wp_unregister_widget_control().
2206   *
2207   * @since 2.2.0
2208   * @deprecated 2.8.0 Use wp_unregister_widget_control()
2209   * @see wp_unregister_widget_control()
2210   *
2211   * @param int|string $id Widget ID.
2212   */
2213  function unregister_widget_control($id) {
2214      _deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_widget_control()' );
2215      return wp_unregister_widget_control($id);
2216  }
2217  
2218  /**
2219   * Remove user meta data.
2220   *
2221   * @since 2.0.0
2222   * @deprecated 3.0.0 Use delete_user_meta()
2223   * @see delete_user_meta()
2224   *
2225   * @global wpdb $wpdb WordPress database abstraction object.
2226   *
2227   * @param int $user_id User ID.
2228   * @param string $meta_key Metadata key.
2229   * @param mixed $meta_value Optional. Metadata value. Default empty.
2230   * @return bool True deletion completed and false if user_id is not a number.
2231   */
2232  function delete_usermeta( $user_id, $meta_key, $meta_value = '' ) {
2233      _deprecated_function( __FUNCTION__, '3.0.0', 'delete_user_meta()' );
2234      global $wpdb;
2235      if ( !is_numeric( $user_id ) )
2236          return false;
2237      $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
2238  
2239      if ( is_array($meta_value) || is_object($meta_value) )
2240          $meta_value = serialize($meta_value);
2241      $meta_value = trim( $meta_value );
2242  
2243      $cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) );
2244  
2245      if ( $cur && $cur->umeta_id )
2246          do_action( 'delete_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );
2247  
2248      if ( ! empty($meta_value) )
2249          $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s AND meta_value = %s", $user_id, $meta_key, $meta_value) );
2250      else
2251          $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) );
2252  
2253      clean_user_cache( $user_id );
2254      wp_cache_delete( $user_id, 'user_meta' );
2255  
2256      if ( $cur && $cur->umeta_id )
2257          do_action( 'deleted_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );
2258  
2259      return true;
2260  }
2261  
2262  /**
2263   * Retrieve user metadata.
2264   *
2265   * If $user_id is not a number, then the function will fail over with a 'false'
2266   * boolean return value. Other returned values depend on whether there is only
2267   * one item to be returned, which be that single item type. If there is more
2268   * than one metadata value, then it will be list of metadata values.
2269   *
2270   * @since 2.0.0
2271   * @deprecated 3.0.0 Use get_user_meta()
2272   * @see get_user_meta()
2273   *
2274   * @global wpdb $wpdb WordPress database abstraction object.
2275   *
2276   * @param int $user_id User ID
2277   * @param string $meta_key Optional. Metadata key. Default empty.
2278   * @return mixed
2279   */
2280  function get_usermeta( $user_id, $meta_key = '' ) {
2281      _deprecated_function( __FUNCTION__, '3.0.0', 'get_user_meta()' );
2282      global $wpdb;
2283      $user_id = (int) $user_id;
2284  
2285      if ( !$user_id )
2286          return false;
2287  
2288      if ( !empty($meta_key) ) {
2289          $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
2290          $user = wp_cache_get($user_id, 'users');
2291          // Check the cached user object.
2292          if ( false !== $user && isset($user->$meta_key) )
2293              $metas = array($user->$meta_key);
2294          else
2295              $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) );
2296      } else {
2297          $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d", $user_id) );
2298      }
2299  
2300      if ( empty($metas) ) {
2301          if ( empty($meta_key) )
2302              return array();
2303          else
2304              return '';
2305      }
2306  
2307      $metas = array_map('maybe_unserialize', $metas);
2308  
2309      if ( count($metas) === 1 )
2310          return $metas[0];
2311      else
2312          return $metas;
2313  }
2314  
2315  /**
2316   * Update metadata of user.
2317   *
2318   * There is no need to serialize values, they will be serialized if it is
2319   * needed. The metadata key can only be a string with underscores. All else will
2320   * be removed.
2321   *
2322   * Will remove the metadata, if the meta value is empty.
2323   *
2324   * @since 2.0.0
2325   * @deprecated 3.0.0 Use update_user_meta()
2326   * @see update_user_meta()
2327   *
2328   * @global wpdb $wpdb WordPress database abstraction object.
2329   *
2330   * @param int $user_id User ID
2331   * @param string $meta_key Metadata key.
2332   * @param mixed $meta_value Metadata value.
2333   * @return bool True on successful update, false on failure.
2334   */
2335  function update_usermeta( $user_id, $meta_key, $meta_value ) {
2336      _deprecated_function( __FUNCTION__, '3.0.0', 'update_user_meta()' );
2337      global $wpdb;
2338      if ( !is_numeric( $user_id ) )
2339          return false;
2340      $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);
2341  
2342      /** @todo Might need fix because usermeta data is assumed to be already escaped */
2343      if ( is_string($meta_value) )
2344          $meta_value = stripslashes($meta_value);
2345      $meta_value = maybe_serialize($meta_value);
2346  
2347      if (empty($meta_value)) {
2348          return delete_usermeta($user_id, $meta_key);
2349      }
2350  
2351      $cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) );
2352  
2353      if ( $cur )
2354          do_action( 'update_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );
2355  
2356      if ( !$cur )
2357          $wpdb->insert($wpdb->usermeta, compact('user_id', 'meta_key', 'meta_value') );
2358      elseif ( $cur->meta_value != $meta_value )
2359          $wpdb->update($wpdb->usermeta, compact('meta_value'), compact('user_id', 'meta_key') );
2360      else
2361          return false;
2362  
2363      clean_user_cache( $user_id );
2364      wp_cache_delete( $user_id, 'user_meta' );
2365  
2366      if ( !$cur )
2367          do_action( 'added_usermeta', $wpdb->insert_id, $user_id, $meta_key, $meta_value );
2368      else
2369          do_action( 'updated_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );
2370  
2371      return true;
2372  }
2373  
2374  /**
2375   * Get users for the site.
2376   *
2377   * For setups that use the multisite feature. Can be used outside of the
2378   * multisite feature.
2379   *
2380   * @since 2.2.0
2381   * @deprecated 3.1.0 Use get_users()
2382   * @see get_users()
2383   *
2384   * @global wpdb $wpdb WordPress database abstraction object.
2385   *
2386   * @param int $id Site ID.
2387   * @return array List of users that are part of that site ID
2388   */
2389  function get_users_of_blog( $id = '' ) {
2390      _deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' );
2391  
2392      global $wpdb;
2393      if ( empty( $id ) ) {
2394          $id = get_current_blog_id();
2395      }
2396      $blog_prefix = $wpdb->get_blog_prefix($id);
2397      $users = $wpdb->get_results( "SELECT user_id, user_id AS ID, user_login, display_name, user_email, meta_value FROM $wpdb->users, $wpdb->usermeta WHERE {$wpdb->users}.ID = {$wpdb->usermeta}.user_id AND meta_key = '{$blog_prefix}capabilities' ORDER BY {$wpdb->usermeta}.user_id" );
2398      return $users;
2399  }
2400  
2401  /**
2402   * Enable/disable automatic general feed link outputting.
2403   *
2404   * @since 2.8.0
2405   * @deprecated 3.0.0 Use add_theme_support()
2406   * @see add_theme_support()
2407   *
2408   * @param bool $add Optional. Add or remove links. Default true.
2409   */
2410  function automatic_feed_links( $add = true ) {
2411      _deprecated_function( __FUNCTION__, '3.0.0', "add_theme_support( 'automatic-feed-links' )" );
2412  
2413      if ( $add )
2414          add_theme_support( 'automatic-feed-links' );
2415      else
2416          remove_action( 'wp_head', 'feed_links_extra', 3 ); // Just do this yourself in 3.0+.
2417  }
2418  
2419  /**
2420   * Retrieve user data based on field.
2421   *
2422   * @since 1.5.0
2423   * @deprecated 3.0.0 Use get_the_author_meta()
2424   * @see get_the_author_meta()
2425   *
2426   * @param string    $field User meta field.
2427   * @param false|int $user  Optional. User ID to retrieve the field for. Default false (current user).
2428   * @return string The author's field from the current author's DB object.
2429   */
2430  function get_profile( $field, $user = false ) {
2431      _deprecated_function( __FUNCTION__, '3.0.0', 'get_the_author_meta()' );
2432      if ( $user ) {
2433          $user = get_user_by( 'login', $user );
2434          $user = $user->ID;
2435      }
2436      return get_the_author_meta( $field, $user );
2437  }
2438  
2439  /**
2440   * Retrieves the number of posts a user has written.
2441   *
2442   * @since 0.71
2443   * @deprecated 3.0.0 Use count_user_posts()
2444   * @see count_user_posts()
2445   *
2446   * @param int $userid User to count posts for.
2447   * @return int Number of posts the given user has written.
2448   */
2449  function get_usernumposts( $userid ) {
2450      _deprecated_function( __FUNCTION__, '3.0.0', 'count_user_posts()' );
2451      return count_user_posts( $userid );
2452  }
2453  
2454  /**
2455   * Callback used to change %uXXXX to &#YYY; syntax
2456   *
2457   * @since 2.8.0
2458   * @access private
2459   * @deprecated 3.0.0
2460   *
2461   * @param array $matches Single Match
2462   * @return string An HTML entity
2463   */
2464  function funky_javascript_callback($matches) {
2465      return "&#".base_convert($matches[1],16,10).";";
2466  }
2467  
2468  /**
2469   * Fixes JavaScript bugs in browsers.
2470   *
2471   * Converts unicode characters to HTML numbered entities.
2472   *
2473   * @since 1.5.0
2474   * @deprecated 3.0.0
2475   *
2476   * @global $is_macIE
2477   * @global $is_winIE
2478   *
2479   * @param string $text Text to be made safe.
2480   * @return string Fixed text.
2481   */
2482  function funky_javascript_fix($text) {
2483      _deprecated_function( __FUNCTION__, '3.0.0' );
2484      // Fixes for browsers' JavaScript bugs.
2485      global $is_macIE, $is_winIE;
2486  
2487      if ( $is_winIE || $is_macIE )
2488          $text =  preg_replace_callback("/\%u([0-9A-F]{4,4})/",
2489                      "funky_javascript_callback",
2490                      $text);
2491  
2492      return $text;
2493  }
2494  
2495  /**
2496   * Checks that the taxonomy name exists.
2497   *
2498   * @since 2.3.0
2499   * @deprecated 3.0.0 Use taxonomy_exists()
2500   * @see taxonomy_exists()
2501   *
2502   * @param string $taxonomy Name of taxonomy object
2503   * @return bool Whether the taxonomy exists.
2504   */
2505  function is_taxonomy( $taxonomy ) {
2506      _deprecated_function( __FUNCTION__, '3.0.0', 'taxonomy_exists()' );
2507      return taxonomy_exists( $taxonomy );
2508  }
2509  
2510  /**
2511   * Check if Term exists.
2512   *
2513   * @since 2.3.0
2514   * @deprecated 3.0.0 Use term_exists()
2515   * @see term_exists()
2516   *
2517   * @param int|string $term The term to check
2518   * @param string $taxonomy The taxonomy name to use
2519   * @param int $parent ID of parent term under which to confine the exists search.
2520   * @return mixed Get the term ID or term object, if exists.
2521   */
2522  function is_term( $term, $taxonomy = '', $parent = 0 ) {
2523      _deprecated_function( __FUNCTION__, '3.0.0', 'term_exists()' );
2524      return term_exists( $term, $taxonomy, $parent );
2525  }
2526  
2527  /**
2528   * Determines whether the current admin page is generated by a plugin.
2529   *
2530   * Use global $plugin_page and/or get_plugin_page_hookname() hooks.
2531   *
2532   * For more information on this and similar theme functions, check out
2533   * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
2534   * Conditional Tags} article in the Theme Developer Handbook.
2535   *
2536   * @since 1.5.0
2537   * @deprecated 3.1.0
2538   *
2539   * @global $plugin_page
2540   *
2541   * @return bool
2542   */
2543  function is_plugin_page() {
2544      _deprecated_function( __FUNCTION__, '3.1.0' );
2545  
2546      global $plugin_page;
2547  
2548      if ( isset($plugin_page) )
2549          return true;
2550  
2551      return false;
2552  }
2553  
2554  /**
2555   * Update the categories cache.
2556   *
2557   * This function does not appear to be used anymore or does not appear to be
2558   * needed. It might be a legacy function left over from when there was a need
2559   * for updating the category cache.
2560   *
2561   * @since 1.5.0
2562   * @deprecated 3.1.0
2563   *
2564   * @return bool Always return True
2565   */
2566  function update_category_cache() {
2567      _deprecated_function( __FUNCTION__, '3.1.0' );
2568  
2569      return true;
2570  }
2571  
2572  /**
2573   * Check for PHP timezone support
2574   *
2575   * @since 2.9.0
2576   * @deprecated 3.2.0
2577   *
2578   * @return bool
2579   */
2580  function wp_timezone_supported() {
2581      _deprecated_function( __FUNCTION__, '3.2.0' );
2582  
2583      return true;
2584  }
2585  
2586  /**
2587   * Displays an editor: TinyMCE, HTML, or both.
2588   *
2589   * @since 2.1.0
2590   * @deprecated 3.3.0 Use wp_editor()
2591   * @see wp_editor()
2592   *
2593   * @param string $content       Textarea content.
2594   * @param string $id            Optional. HTML ID attribute value. Default 'content'.
2595   * @param string $prev_id       Optional. Unused.
2596   * @param bool   $media_buttons Optional. Whether to display media buttons. Default true.
2597   * @param int    $tab_index     Optional. Unused.
2598   * @param bool   $extended      Optional. Unused.
2599   */
2600  function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) {
2601      _deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' );
2602  
2603      wp_editor( $content, $id, array( 'media_buttons' => $media_buttons ) );
2604  }
2605  
2606  /**
2607   * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users
2608   *
2609   * @since 3.0.0
2610   * @deprecated 3.3.0
2611   *
2612   * @param array $ids User ID numbers list.
2613   * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays.
2614   */
2615  function get_user_metavalues($ids) {
2616      _deprecated_function( __FUNCTION__, '3.3.0' );
2617  
2618      $objects = array();
2619  
2620      $ids = array_map('intval', $ids);
2621      foreach ( $ids as $id )
2622          $objects[$id] = array();
2623  
2624      $metas = update_meta_cache('user', $ids);
2625  
2626      foreach ( $metas as $id => $meta ) {
2627          foreach ( $meta as $key => $metavalues ) {
2628              foreach ( $metavalues as $value ) {
2629                  $objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value);
2630              }
2631          }
2632      }
2633  
2634      return $objects;
2635  }
2636  
2637  /**
2638   * Sanitize every user field.
2639   *
2640   * If the context is 'raw', then the user object or array will get minimal sanitization of the int fields.
2641   *
2642   * @since 2.3.0
2643   * @deprecated 3.3.0
2644   *
2645   * @param object|array $user    The user object or array.
2646   * @param string       $context Optional. How to sanitize user fields. Default 'display'.
2647   * @return object|array The now sanitized user object or array (will be the same type as $user).
2648   */
2649  function sanitize_user_object($user, $context = 'display') {
2650      _deprecated_function( __FUNCTION__, '3.3.0' );
2651  
2652      if ( is_object($user) ) {
2653          if ( !isset($user->ID) )
2654              $user->ID = 0;
2655          if ( ! ( $user instanceof WP_User ) ) {
2656              $vars = get_object_vars($user);
2657              foreach ( array_keys($vars) as $field ) {
2658                  if ( is_string($user->$field) || is_numeric($user->$field) )
2659                      $user->$field = sanitize_user_field($field, $user->$field, $user->ID, $context);
2660              }
2661          }
2662          $user->filter = $context;
2663      } else {
2664          if ( !isset($user['ID']) )
2665              $user['ID'] = 0;
2666          foreach ( array_keys($user) as $field )
2667              $user[$field] = sanitize_user_field($field, $user[$field], $user['ID'], $context);
2668          $user['filter'] = $context;
2669      }
2670  
2671      return $user;
2672  }
2673  
2674  /**
2675   * Get boundary post relational link.
2676   *
2677   * Can either be start or end post relational link.
2678   *
2679   * @since 2.8.0
2680   * @deprecated 3.3.0
2681   *
2682   * @param string $title               Optional. Link title format. Default '%title'.
2683   * @param bool   $in_same_cat         Optional. Whether link should be in a same category.
2684   *                                    Default false.
2685   * @param string $excluded_categories Optional. Excluded categories IDs. Default empty.
2686   * @param bool   $start               Optional. Whether to display link to first or last post.
2687   *                                    Default true.
2688   * @return string
2689   */
2690  function get_boundary_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '', $start = true) {
2691      _deprecated_function( __FUNCTION__, '3.3.0' );
2692  
2693      $posts = get_boundary_post($in_same_cat, $excluded_categories, $start);
2694      // If there is no post, stop.
2695      if ( empty($posts) )
2696          return;
2697  
2698      // Even though we limited get_posts() to return only 1 item it still returns an array of objects.
2699      $post = $posts[0];
2700  
2701      if ( empty($post->post_title) )
2702          $post->post_title = $start ? __('First Post') : __('Last Post');
2703  
2704      $date = mysql2date(get_option('date_format'), $post->post_date);
2705  
2706      $title = str_replace('%title', $post->post_title, $title);
2707      $title = str_replace('%date', $date, $title);
2708      /** This filter is documented in wp-includes/post-template.php */
2709      $title = apply_filters('the_title', $title, $post->ID);
2710  
2711      $link = $start ? "<link rel='start' title='" : "<link rel='end' title='";
2712      $link .= esc_attr($title);
2713      $link .= "' href='" . get_permalink($post) . "' />\n";
2714  
2715      $boundary = $start ? 'start' : 'end';
2716      return apply_filters( "{$boundary}_post_rel_link", $link );
2717  }
2718  
2719  /**
2720   * Display relational link for the first post.
2721   *
2722   * @since 2.8.0
2723   * @deprecated 3.3.0
2724   *
2725   * @param string $title Optional. Link title format.
2726   * @param bool $in_same_cat Optional. Whether link should be in a same category.
2727   * @param string $excluded_categories Optional. Excluded categories IDs.
2728   */
2729  function start_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '') {
2730      _deprecated_function( __FUNCTION__, '3.3.0' );
2731  
2732      echo get_boundary_post_rel_link($title, $in_same_cat, $excluded_categories, true);
2733  }
2734  
2735  /**
2736   * Get site index relational link.
2737   *
2738   * @since 2.8.0
2739   * @deprecated 3.3.0
2740   *
2741   * @return string
2742   */
2743  function get_index_rel_link() {
2744      _deprecated_function( __FUNCTION__, '3.3.0' );
2745  
2746      $link = "<link rel='index' title='" . esc_attr( get_bloginfo( 'name', 'display' ) ) . "' href='" . esc_url( user_trailingslashit( get_bloginfo( 'url', 'display' ) ) ) . "' />\n";
2747      return apply_filters( "index_rel_link", $link );
2748  }
2749  
2750  /**
2751   * Display relational link for the site index.
2752   *
2753   * @since 2.8.0
2754   * @deprecated 3.3.0
2755   */
2756  function index_rel_link() {
2757      _deprecated_function( __FUNCTION__, '3.3.0' );
2758  
2759      echo get_index_rel_link();
2760  }
2761  
2762  /**
2763   * Get parent post relational link.
2764   *
2765   * @since 2.8.0
2766   * @deprecated 3.3.0
2767   *
2768   * @global WP_Post $post Global post object.
2769   *
2770   * @param string $title Optional. Link title format. Default '%title'.
2771   * @return string
2772   */
2773  function get_parent_post_rel_link( $title = '%title' ) {
2774      _deprecated_function( __FUNCTION__, '3.3.0' );
2775  
2776      if ( ! empty( $GLOBALS['post'] ) && ! empty( $GLOBALS['post']->post_parent ) )
2777          $post = get_post($GLOBALS['post']->post_parent);
2778  
2779      if ( empty($post) )
2780          return;
2781  
2782      $date = mysql2date(get_option('date_format'), $post->post_date);
2783  
2784      $title = str_replace('%title', $post->post_title, $title);
2785      $title = str_replace('%date', $date, $title);
2786      /** This filter is documented in wp-includes/post-template.php */
2787      $title = apply_filters('the_title', $title, $post->ID);
2788  
2789      $link = "<link rel='up' title='";
2790      $link .= esc_attr( $title );
2791      $link .= "' href='" . get_permalink($post) . "' />\n";
2792  
2793      return apply_filters( "parent_post_rel_link", $link );
2794  }
2795  
2796  /**
2797   * Display relational link for parent item
2798   *
2799   * @since 2.8.0
2800   * @deprecated 3.3.0
2801   *
2802   * @param string $title Optional. Link title format. Default '%title'.
2803   */
2804  function parent_post_rel_link( $title = '%title' ) {
2805      _deprecated_function( __FUNCTION__, '3.3.0' );
2806  
2807      echo get_parent_post_rel_link($title);
2808  }
2809  
2810  /**
2811   * Add the "Dashboard"/"Visit Site" menu.
2812   *
2813   * @since 3.2.0
2814   * @deprecated 3.3.0
2815   *
2816   * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance.
2817   */
2818  function wp_admin_bar_dashboard_view_site_menu( $wp_admin_bar ) {
2819      _deprecated_function( __FUNCTION__, '3.3.0' );
2820  
2821      $user_id = get_current_user_id();
2822  
2823      if ( 0 != $user_id ) {
2824          if ( is_admin() )
2825              $wp_admin_bar->add_menu( array( 'id' => 'view-site', 'title' => __( 'Visit Site' ), 'href' => home_url() ) );
2826          elseif ( is_multisite() )
2827              $wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => get_dashboard_url( $user_id ) ) );
2828          else
2829              $wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => admin_url() ) );
2830      }
2831  }
2832  
2833  /**
2834   * Checks if the current user belong to a given site.
2835   *
2836   * @since MU (3.0.0)
2837   * @deprecated 3.3.0 Use is_user_member_of_blog()
2838   * @see is_user_member_of_blog()
2839   *
2840   * @param int $blog_id Site ID
2841   * @return bool True if the current users belong to $blog_id, false if not.
2842   */
2843  function is_blog_user( $blog_id = 0 ) {
2844      _deprecated_function( __FUNCTION__, '3.3.0', 'is_user_member_of_blog()' );
2845  
2846      return is_user_member_of_blog( get_current_user_id(), $blog_id );
2847  }
2848  
2849  /**
2850   * Open the file handle for debugging.
2851   *
2852   * @since 0.71
2853   * @deprecated 3.4.0 Use error_log()
2854   * @see error_log()
2855   *
2856   * @link https://www.php.net/manual/en/function.error-log.php
2857   *
2858   * @param string $filename File name.
2859   * @param string $mode     Type of access you required to the stream.
2860   * @return false Always false.
2861   */
2862  function debug_fopen( $filename, $mode ) {
2863      _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' );
2864      return false;
2865  }
2866  
2867  /**
2868   * Write contents to the file used for debugging.
2869   *
2870   * @since 0.71
2871   * @deprecated 3.4.0 Use error_log()
2872   * @see error_log()
2873   *
2874   * @link https://www.php.net/manual/en/function.error-log.php
2875   *
2876   * @param mixed  $fp      Unused.
2877   * @param string $message Message to log.
2878   */
2879  function debug_fwrite( $fp, $message ) {
2880      _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' );
2881      if ( ! empty( $GLOBALS['debug'] ) )
2882          error_log( $message );
2883  }
2884  
2885  /**
2886   * Close the debugging file handle.
2887   *
2888   * @since 0.71
2889   * @deprecated 3.4.0 Use error_log()
2890   * @see error_log()
2891   *
2892   * @link https://www.php.net/manual/en/function.error-log.php
2893   *
2894   * @param mixed $fp Unused.
2895   */
2896  function debug_fclose( $fp ) {
2897      _deprecated_function( __FUNCTION__, '3.4.0', 'error_log()' );
2898  }
2899  
2900  /**
2901   * Retrieve list of themes with theme data in theme directory.
2902   *
2903   * The theme is broken, if it doesn't have a parent theme and is missing either
2904   * style.css and, or index.php. If the theme has a parent theme then it is
2905   * broken, if it is missing style.css; index.php is optional.
2906   *
2907   * @since 1.5.0
2908   * @deprecated 3.4.0 Use wp_get_themes()
2909   * @see wp_get_themes()
2910   *
2911   * @return array Theme list with theme data.
2912   */
2913  function get_themes() {
2914      _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_themes()' );
2915  
2916      global $wp_themes;
2917      if ( isset( $wp_themes ) )
2918          return $wp_themes;
2919  
2920      $themes = wp_get_themes();
2921      $wp_themes = array();
2922  
2923      foreach ( $themes as $theme ) {
2924          $name = $theme->get('Name');
2925          if ( isset( $wp_themes[ $name ] ) )
2926              $wp_themes[ $name . '/' . $theme->get_stylesheet() ] = $theme;
2927          else
2928              $wp_themes[ $name ] = $theme;
2929      }
2930  
2931      return $wp_themes;
2932  }
2933  
2934  /**
2935   * Retrieve theme data.
2936   *
2937   * @since 1.5.0
2938   * @deprecated 3.4.0 Use wp_get_theme()
2939   * @see wp_get_theme()
2940   *
2941   * @param string $theme Theme name.
2942   * @return array|null Null, if theme name does not exist. Theme data, if exists.
2943   */
2944  function get_theme( $theme ) {
2945      _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme( $stylesheet )' );
2946  
2947      $themes = get_themes();
2948      if ( is_array( $themes ) && array_key_exists( $theme, $themes ) )
2949          return $themes[ $theme ];
2950      return null;
2951  }
2952  
2953  /**
2954   * Retrieve current theme name.
2955   *
2956   * @since 1.5.0
2957   * @deprecated 3.4.0 Use wp_get_theme()
2958   * @see wp_get_theme()
2959   *
2960   * @return string
2961   */
2962  function get_current_theme() {
2963      _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' );
2964  
2965      if ( $theme = get_option( 'current_theme' ) )
2966          return $theme;
2967  
2968      return wp_get_theme()->get('Name');
2969  }
2970  
2971  /**
2972   * Accepts matches array from preg_replace_callback in wpautop() or a string.
2973   *
2974   * Ensures that the contents of a `<pre>...</pre>` HTML block are not
2975   * converted into paragraphs or line breaks.
2976   *
2977   * @since 1.2.0
2978   * @deprecated 3.4.0
2979   *
2980   * @param array|string $matches The array or string
2981   * @return string The pre block without paragraph/line break conversion.
2982   */
2983  function clean_pre($matches) {
2984      _deprecated_function( __FUNCTION__, '3.4.0' );
2985  
2986      if ( is_array($matches) )
2987          $text = $matches[1] . $matches[2] . "</pre>";
2988      else
2989          $text = $matches;
2990  
2991      $text = str_replace(array('<br />', '<br/>', '<br>'), array('', '', ''), $text);
2992      $text = str_replace('<p>', "\n", $text);
2993      $text = str_replace('</p>', '', $text);
2994  
2995      return $text;
2996  }
2997  
2998  
2999  /**
3000   * Add callbacks for image header display.
3001   *
3002   * @since 2.1.0
3003   * @deprecated 3.4.0 Use add_theme_support()
3004   * @see add_theme_support()
3005   *
3006   * @param callable $wp_head_callback Call on the {@see 'wp_head'} action.
3007   * @param callable $admin_head_callback Call on custom header administration screen.
3008   * @param callable $admin_preview_callback Output a custom header image div on the custom header administration screen. Optional.
3009   */
3010  function add_custom_image_header( $wp_head_callback, $admin_head_callback, $admin_preview_callback = '' ) {
3011      _deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-header\', $args )' );
3012      $args = array(
3013          'wp-head-callback'    => $wp_head_callback,
3014          'admin-head-callback' => $admin_head_callback,
3015      );
3016      if ( $admin_preview_callback )
3017          $args['admin-preview-callback'] = $admin_preview_callback;
3018      return add_theme_support( 'custom-header', $args );
3019  }
3020  
3021  /**
3022   * Remove image header support.
3023   *
3024   * @since 3.1.0
3025   * @deprecated 3.4.0 Use remove_theme_support()
3026   * @see remove_theme_support()
3027   *
3028   * @return null|bool Whether support was removed.
3029   */
3030  function remove_custom_image_header() {
3031      _deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-header\' )' );
3032      return remove_theme_support( 'custom-header' );
3033  }
3034  
3035  /**
3036   * Add callbacks for background image display.
3037   *
3038   * @since 3.0.0
3039   * @deprecated 3.4.0 Use add_theme_support()
3040   * @see add_theme_support()
3041   *
3042   * @param callable $wp_head_callback Call on the {@see 'wp_head'} action.
3043   * @param callable $admin_head_callback Call on custom background administration screen.
3044   * @param callable $admin_preview_callback Output a custom background image div on the custom background administration screen. Optional.
3045   */
3046  function add_custom_background( $wp_head_callback = '', $admin_head_callback = '', $admin_preview_callback = '' ) {
3047      _deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-background\', $args )' );
3048      $args = array();
3049      if ( $wp_head_callback )
3050          $args['wp-head-callback'] = $wp_head_callback;
3051      if ( $admin_head_callback )
3052          $args['admin-head-callback'] = $admin_head_callback;
3053      if ( $admin_preview_callback )
3054          $args['admin-preview-callback'] = $admin_preview_callback;
3055      return add_theme_support( 'custom-background', $args );
3056  }
3057  
3058  /**
3059   * Remove custom background support.
3060   *
3061   * @since 3.1.0
3062   * @deprecated 3.4.0 Use add_custom_background()
3063   * @see add_custom_background()
3064   *
3065   * @return null|bool Whether support was removed.
3066   */
3067  function remove_custom_background() {
3068      _deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-background\' )' );
3069      return remove_theme_support( 'custom-background' );
3070  }
3071  
3072  /**
3073   * Retrieve theme data from parsed theme file.
3074   *
3075   * @since 1.5.0
3076   * @deprecated 3.4.0 Use wp_get_theme()
3077   * @see wp_get_theme()
3078   *
3079   * @param string $theme_file Theme file path.
3080   * @return array Theme data.
3081   */
3082  function get_theme_data( $theme_file ) {
3083      _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' );
3084      $theme = new WP_Theme( wp_basename( dirname( $theme_file ) ), dirname( dirname( $theme_file ) ) );
3085  
3086      $theme_data = array(
3087          'Name' => $theme->get('Name'),
3088          'URI' => $theme->display('ThemeURI', true, false),
3089          'Description' => $theme->display('Description', true, false),
3090          'Author' => $theme->display('Author', true, false),
3091          'AuthorURI' => $theme->display('AuthorURI', true, false),
3092          'Version' => $theme->get('Version'),
3093          'Template' => $theme->get('Template'),
3094          'Status' => $theme->get('Status'),
3095          'Tags' => $theme->get('Tags'),
3096          'Title' => $theme->get('Name'),
3097          'AuthorName' => $theme->get('Author'),
3098      );
3099  
3100      foreach ( apply_filters( 'extra_theme_headers', array() ) as $extra_header ) {
3101          if ( ! isset( $theme_data[ $extra_header ] ) )
3102              $theme_data[ $extra_header ] = $theme->get( $extra_header );
3103      }
3104  
3105      return $theme_data;
3106  }
3107  
3108  /**
3109   * Alias of update_post_cache().
3110   *
3111   * @see update_post_cache() Posts and pages are the same, alias is intentional
3112   *
3113   * @since 1.5.1
3114   * @deprecated 3.4.0 Use update_post_cache()
3115   * @see update_post_cache()
3116   *
3117   * @param array $pages list of page objects
3118   */
3119  function update_page_cache( &$pages ) {
3120      _deprecated_function( __FUNCTION__, '3.4.0', 'update_post_cache()' );
3121  
3122      update_post_cache( $pages );
3123  }
3124  
3125  /**
3126   * Will clean the page in the cache.
3127   *
3128   * Clean (read: delete) page from cache that matches $id. Will also clean cache
3129   * associated with 'all_page_ids' and 'get_pages'.
3130   *
3131   * @since 2.0.0
3132   * @deprecated 3.4.0 Use clean_post_cache
3133   * @see clean_post_cache()
3134   *
3135   * @param int $id Page ID to clean
3136   */
3137  function clean_page_cache( $id ) {
3138      _deprecated_function( __FUNCTION__, '3.4.0', 'clean_post_cache()' );
3139  
3140      clean_post_cache( $id );
3141  }
3142  
3143  /**
3144   * Retrieve nonce action "Are you sure" message.
3145   *
3146   * Deprecated in 3.4.1 and 3.5.0. Backported to 3.3.3.
3147   *
3148   * @since 2.0.4
3149   * @deprecated 3.4.1 Use wp_nonce_ays()
3150   * @see wp_nonce_ays()
3151   *
3152   * @param string $action Nonce action.
3153   * @return string Are you sure message.
3154   */
3155  function wp_explain_nonce( $action ) {
3156      _deprecated_function( __FUNCTION__, '3.4.1', 'wp_nonce_ays()' );
3157      return __( 'Are you sure you want to do this?' );
3158  }
3159  
3160  /**
3161   * Display "sticky" CSS class, if a post is sticky.
3162   *
3163   * @since 2.7.0
3164   * @deprecated 3.5.0 Use post_class()
3165   * @see post_class()
3166   *
3167   * @param int $post_id An optional post ID.
3168   */
3169  function sticky_class( $post_id = null ) {
3170      _deprecated_function( __FUNCTION__, '3.5.0', 'post_class()' );
3171      if ( is_sticky( $post_id ) )
3172          echo ' sticky';
3173  }
3174  
3175  /**
3176   * Retrieve post ancestors.
3177   *
3178   * This is no longer needed as WP_Post lazy-loads the ancestors
3179   * property with get_post_ancestors().
3180   *
3181   * @since 2.3.4
3182   * @deprecated 3.5.0 Use get_post_ancestors()
3183   * @see get_post_ancestors()
3184   *
3185   * @param WP_Post $post Post object, passed by reference (unused).
3186   */
3187  function _get_post_ancestors( &$post ) {
3188      _deprecated_function( __FUNCTION__, '3.5.0' );
3189  }
3190  
3191  /**
3192   * Load an image from a string, if PHP supports it.
3193   *
3194   * @since 2.1.0
3195   * @deprecated 3.5.0 Use wp_get_image_editor()
3196   * @see wp_get_image_editor()
3197   *
3198   * @param string $file Filename of the image to load.
3199   * @return resource|GdImage|string The resulting image resource or GdImage instance on success,
3200   *                                 error string on failure.
3201   */
3202  function wp_load_image( $file ) {
3203      _deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' );
3204  
3205      if ( is_numeric( $file ) )
3206          $file = get_attached_file( $file );
3207  
3208      if ( ! is_file( $file ) ) {
3209          /* translators: %s: File name. */
3210          return sprintf( __( 'File &#8220;%s&#8221; does not exist?' ), $file );
3211      }
3212  
3213      if ( ! function_exists('imagecreatefromstring') )
3214          return __('The GD image library is not installed.');
3215  
3216      // Set artificially high because GD uses uncompressed images in memory.
3217      wp_raise_memory_limit( 'image' );
3218  
3219      $image = imagecreatefromstring( file_get_contents( $file ) );
3220  
3221      if ( ! is_gd_image( $image ) ) {
3222          /* translators: %s: File name. */
3223          return sprintf( __( 'File &#8220;%s&#8221; is not an image.' ), $file );
3224      }
3225  
3226      return $image;
3227  }
3228  
3229  /**
3230   * Scale down an image to fit a particular size and save a new copy of the image.
3231   *
3232   * The PNG transparency will be preserved using the function, as well as the
3233   * image type. If the file going in is PNG, then the resized image is going to
3234   * be PNG. The only supported image types are PNG, GIF, and JPEG.
3235   *
3236   * Some functionality requires API to exist, so some PHP version may lose out
3237   * support. This is not the fault of WordPress (where functionality is
3238   * downgraded, not actual defects), but of your PHP version.
3239   *
3240   * @since 2.5.0
3241   * @deprecated 3.5.0 Use wp_get_image_editor()
3242   * @see wp_get_image_editor()
3243   *
3244   * @param string $file         Image file path.
3245   * @param int    $max_w        Maximum width to resize to.
3246   * @param int    $max_h        Maximum height to resize to.
3247   * @param bool   $crop         Optional. Whether to crop image or resize. Default false.
3248   * @param string $suffix       Optional. File suffix. Default null.
3249   * @param string $dest_path    Optional. New image file path. Default null.
3250   * @param int    $jpeg_quality Optional. Image quality percentage. Default 90.
3251   * @return mixed WP_Error on failure. String with new destination path.
3252   */
3253  function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) {
3254      _deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' );
3255  
3256      $editor = wp_get_image_editor( $file );
3257      if ( is_wp_error( $editor ) )
3258          return $editor;
3259      $editor->set_quality( $jpeg_quality );
3260  
3261      $resized = $editor->resize( $max_w, $max_h, $crop );
3262      if ( is_wp_error( $resized ) )
3263          return $resized;
3264  
3265      $dest_file = $editor->generate_filename( $suffix, $dest_path );
3266      $saved = $editor->save( $dest_file );
3267  
3268      if ( is_wp_error( $saved ) )
3269          return $saved;
3270  
3271      return $dest_file;
3272  }
3273  
3274  /**
3275   * Retrieve a single post, based on post ID.
3276   *
3277   * Has categories in 'post_category' property or key. Has tags in 'tags_input'
3278   * property or key.
3279   *
3280   * @since 1.0.0
3281   * @deprecated 3.5.0 Use get_post()
3282   * @see get_post()
3283   *
3284   * @param int $postid Post ID.
3285   * @param string $mode How to return result, either OBJECT, ARRAY_N, or ARRAY_A.
3286   * @return WP_Post|null Post object or array holding post contents and information
3287   */
3288  function wp_get_single_post( $postid = 0, $mode = OBJECT ) {
3289      _deprecated_function( __FUNCTION__, '3.5.0', 'get_post()' );
3290      return get_post( $postid, $mode );
3291  }
3292  
3293  /**
3294   * Check that the user login name and password is correct.
3295   *
3296   * @since 0.71
3297   * @deprecated 3.5.0 Use wp_authenticate()
3298   * @see wp_authenticate()
3299   *
3300   * @param string $user_login User name.
3301   * @param string $user_pass User password.
3302   * @return bool False if does not authenticate, true if username and password authenticates.
3303   */
3304  function user_pass_ok($user_login, $user_pass) {
3305      _deprecated_function( __FUNCTION__, '3.5.0', 'wp_authenticate()' );
3306      $user = wp_authenticate( $user_login, $user_pass );
3307      if ( is_wp_error( $user ) )
3308          return false;
3309  
3310      return true;
3311  }
3312  
3313  /**
3314   * Callback formerly fired on the save_post hook. No longer needed.
3315   *
3316   * @since 2.3.0
3317   * @deprecated 3.5.0
3318   */
3319  function _save_post_hook() {}
3320  
3321  /**
3322   * Check if the installed version of GD supports particular image type
3323   *
3324   * @since 2.9.0
3325   * @deprecated 3.5.0 Use wp_image_editor_supports()
3326   * @see wp_image_editor_supports()
3327   *
3328   * @param string $mime_type
3329   * @return bool
3330   */
3331  function gd_edit_image_support($mime_type) {
3332      _deprecated_function( __FUNCTION__, '3.5.0', 'wp_image_editor_supports()' );
3333  
3334      if ( function_exists('imagetypes') ) {
3335          switch( $mime_type ) {
3336              case 'image/jpeg':
3337                  return (imagetypes() & IMG_JPG) != 0;
3338              case 'image/png':
3339                  return (imagetypes() & IMG_PNG) != 0;
3340              case 'image/gif':
3341                  return (imagetypes() & IMG_GIF) != 0;
3342              case 'image/webp':
3343                  return (imagetypes() & IMG_WEBP) != 0;
3344              case 'image/avif':
3345                  return (imagetypes() & IMG_AVIF) != 0;
3346              }
3347      } else {
3348          switch( $mime_type ) {
3349              case 'image/jpeg':
3350                  return function_exists('imagecreatefromjpeg');
3351              case 'image/png':
3352                  return function_exists('imagecreatefrompng');
3353              case 'image/gif':
3354                  return function_exists('imagecreatefromgif');
3355              case 'image/webp':
3356                  return function_exists('imagecreatefromwebp');
3357              case 'image/avif':
3358                  return function_exists('imagecreatefromavif');
3359          }
3360      }
3361      return false;
3362  }
3363  
3364  /**
3365   * Converts an integer byte value to a shorthand byte value.
3366   *
3367   * @since 2.3.0
3368   * @deprecated 3.6.0 Use size_format()
3369   * @see size_format()
3370   *
3371   * @param int $bytes An integer byte value.
3372   * @return string A shorthand byte value.
3373   */
3374  function wp_convert_bytes_to_hr( $bytes ) {
3375      _deprecated_function( __FUNCTION__, '3.6.0', 'size_format()' );
3376  
3377      $units = array( 0 => 'B', 1 => 'KB', 2 => 'MB', 3 => 'GB', 4 => 'TB' );
3378      $log   = log( $bytes, KB_IN_BYTES );
3379      $power = ! is_nan( $log ) && ! is_infinite( $log ) ? (int) $log : 0;
3380      $size  = KB_IN_BYTES ** ( $log - $power );
3381  
3382      if ( ! is_nan( $size ) && array_key_exists( $power, $units ) ) {
3383          $unit = $units[ $power ];
3384      } else {
3385          $size = $bytes;
3386          $unit = $units[0];
3387      }
3388  
3389      return $size . $unit;
3390  }
3391  
3392  /**
3393   * Formerly used internally to tidy up the search terms.
3394   *
3395   * @since 2.9.0
3396   * @access private
3397   * @deprecated 3.7.0
3398   *
3399   * @param string $t Search terms to "tidy", e.g. trim.
3400   * @return string Trimmed search terms.
3401   */
3402  function _search_terms_tidy( $t ) {
3403      _deprecated_function( __FUNCTION__, '3.7.0' );
3404      return trim( $t, "\"'\n\r " );
3405  }
3406  
3407  /**
3408   * Determine if TinyMCE is available.
3409   *
3410   * Checks to see if the user has deleted the tinymce files to slim down
3411   * their WordPress installation.
3412   *
3413   * @since 2.1.0
3414   * @deprecated 3.9.0
3415   *
3416   * @return bool Whether TinyMCE exists.
3417   */
3418  function rich_edit_exists() {
3419      global $wp_rich_edit_exists;
3420      _deprecated_function( __FUNCTION__, '3.9.0' );
3421  
3422      if ( ! isset( $wp_rich_edit_exists ) )
3423          $wp_rich_edit_exists = file_exists( ABSPATH . WPINC . '/js/tinymce/tinymce.js' );
3424  
3425      return $wp_rich_edit_exists;
3426  }
3427  
3428  /**
3429   * Old callback for tag link tooltips.
3430   *
3431   * @since 2.7.0
3432   * @access private
3433   * @deprecated 3.9.0
3434   *
3435   * @param int $count Number of topics.
3436   * @return int Number of topics.
3437   */
3438  function default_topic_count_text( $count ) {
3439      return $count;
3440  }
3441  
3442  /**
3443   * Formerly used to escape strings before inserting into the DB.
3444   *
3445   * Has not performed this function for many, many years. Use wpdb::prepare() instead.
3446   *
3447   * @since 0.71
3448   * @deprecated 3.9.0
3449   *
3450   * @param string $content The text to format.
3451   * @return string The very same text.
3452   */
3453  function format_to_post( $content ) {
3454      _deprecated_function( __FUNCTION__, '3.9.0' );
3455      return $content;
3456  }
3457  
3458  /**
3459   * Formerly used to escape strings before searching the DB. It was poorly documented and never worked as described.
3460   *
3461   * @since 2.5.0
3462   * @deprecated 4.0.0 Use wpdb::esc_like()
3463   * @see wpdb::esc_like()
3464   *
3465   * @param string $text The text to be escaped.
3466   * @return string text, safe for inclusion in LIKE query.
3467   */
3468  function like_escape($text) {
3469      _deprecated_function( __FUNCTION__, '4.0.0', 'wpdb::esc_like()' );
3470      return str_replace( array( "%", "_" ), array( "\\%", "\\_" ), $text );
3471  }
3472  
3473  /**
3474   * Determines if the URL can be accessed over SSL.
3475   *
3476   * Determines if the URL can be accessed over SSL by using the WordPress HTTP API to access
3477   * the URL using https as the scheme.
3478   *
3479   * @since 2.5.0
3480   * @deprecated 4.0.0
3481   *
3482   * @param string $url The URL to test.
3483   * @return bool Whether SSL access is available.
3484   */
3485  function url_is_accessable_via_ssl( $url ) {
3486      _deprecated_function( __FUNCTION__, '4.0.0' );
3487  
3488      $response = wp_remote_get( set_url_scheme( $url, 'https' ) );
3489  
3490      if ( !is_wp_error( $response ) ) {
3491          $status = wp_remote_retrieve_response_code( $response );
3492          if ( 200 == $status || 401 == $status ) {
3493              return true;
3494          }
3495      }
3496  
3497      return false;
3498  }
3499  
3500  /**
3501   * Start preview theme output buffer.
3502   *
3503   * Will only perform task if the user has permissions and template and preview
3504   * query variables exist.
3505   *
3506   * @since 2.6.0
3507   * @deprecated 4.3.0
3508   */
3509  function preview_theme() {
3510      _deprecated_function( __FUNCTION__, '4.3.0' );
3511  }
3512  
3513  /**
3514   * Private function to modify the current template when previewing a theme
3515   *
3516   * @since 2.9.0
3517   * @deprecated 4.3.0
3518   * @access private
3519   *
3520   * @return string
3521   */
3522  function _preview_theme_template_filter() {
3523      _deprecated_function( __FUNCTION__, '4.3.0' );
3524      return '';
3525  }
3526  
3527  /**
3528   * Private function to modify the current stylesheet when previewing a theme
3529   *
3530   * @since 2.9.0
3531   * @deprecated 4.3.0
3532   * @access private
3533   *
3534   * @return string
3535   */
3536  function _preview_theme_stylesheet_filter() {
3537      _deprecated_function( __FUNCTION__, '4.3.0' );
3538      return '';
3539  }
3540  
3541  /**
3542   * Callback function for ob_start() to capture all links in the theme.
3543   *
3544   * @since 2.6.0
3545   * @deprecated 4.3.0
3546   * @access private
3547   *
3548   * @param string $content
3549   * @return string
3550   */
3551  function preview_theme_ob_filter( $content ) {
3552      _deprecated_function( __FUNCTION__, '4.3.0' );
3553      return $content;
3554  }
3555  
3556  /**
3557   * Manipulates preview theme links in order to control and maintain location.
3558   *
3559   * Callback function for preg_replace_callback() to accept and filter matches.
3560   *
3561   * @since 2.6.0
3562   * @deprecated 4.3.0
3563   * @access private
3564   *
3565   * @param array $matches
3566   * @return string
3567   */
3568  function preview_theme_ob_filter_callback( $matches ) {
3569      _deprecated_function( __FUNCTION__, '4.3.0' );
3570      return '';
3571  }
3572  
3573  /**
3574   * Formats text for the rich text editor.
3575   *
3576   * The {@see 'richedit_pre'} filter is applied here. If `$text` is empty the filter will
3577   * be applied to an empty string.
3578   *
3579   * @since 2.0.0
3580   * @deprecated 4.3.0 Use format_for_editor()
3581   * @see format_for_editor()
3582   *
3583   * @param string $text The text to be formatted.
3584   * @return string The formatted text after filter is applied.
3585   */
3586  function wp_richedit_pre($text) {
3587      _deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' );
3588  
3589      if ( empty( $text ) ) {
3590          /**
3591           * Filters text returned for the rich text editor.
3592           *
3593           * This filter is first evaluated, and the value returned, if an empty string
3594           * is passed to wp_richedit_pre(). If an empty string is passed, it results
3595           * in a break tag and line feed.
3596           *
3597           * If a non-empty string is passed, the filter is evaluated on the wp_richedit_pre()
3598           * return after being formatted.
3599           *
3600           * @since 2.0.0
3601           * @deprecated 4.3.0
3602           *
3603           * @param string $output Text for the rich text editor.
3604           */
3605          return apply_filters( 'richedit_pre', '' );
3606      }
3607  
3608      $output = convert_chars($text);
3609      $output = wpautop($output);
3610      $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) );
3611  
3612      /** This filter is documented in wp-includes/deprecated.php */
3613      return apply_filters( 'richedit_pre', $output );
3614  }
3615  
3616  /**
3617   * Formats text for the HTML editor.
3618   *
3619   * Unless $output is empty it will pass through htmlspecialchars before the
3620   * {@see 'htmledit_pre'} filter is applied.
3621   *
3622   * @since 2.5.0
3623   * @deprecated 4.3.0 Use format_for_editor()
3624   * @see format_for_editor()
3625   *
3626   * @param string $output The text to be formatted.
3627   * @return string Formatted text after filter applied.
3628   */
3629  function wp_htmledit_pre($output) {
3630      _deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' );
3631  
3632      if ( !empty($output) )
3633          $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); // Convert only '< > &'.
3634  
3635      /**
3636       * Filters the text before it is formatted for the HTML editor.
3637       *
3638       * @since 2.5.0
3639       * @deprecated 4.3.0
3640       *
3641       * @param string $output The HTML-formatted text.
3642       */
3643      return apply_filters( 'htmledit_pre', $output );
3644  }
3645  
3646  /**
3647   * Retrieve permalink from post ID.
3648   *
3649   * @since 1.0.0
3650   * @deprecated 4.4.0 Use get_permalink()
3651   * @see get_permalink()
3652   *
3653   * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
3654   * @return string|false
3655   */
3656  function post_permalink( $post = 0 ) {
3657      _deprecated_function( __FUNCTION__, '4.4.0', 'get_permalink()' );
3658  
3659      return get_permalink( $post );
3660  }
3661  
3662  /**
3663   * Perform a HTTP HEAD or GET request.
3664   *
3665   * If $file_path is a writable filename, this will do a GET request and write
3666   * the file to that path.
3667   *
3668   * @since 2.5.0
3669   * @deprecated 4.4.0 Use WP_Http
3670   * @see WP_Http
3671   *
3672   * @param string      $url       URL to fetch.
3673   * @param string|bool $file_path Optional. File path to write request to. Default false.
3674   * @param int         $red       Optional. The number of Redirects followed, Upon 5 being hit,
3675   *                               returns false. Default 1.
3676   * @return \WpOrg\Requests\Utility\CaseInsensitiveDictionary|false Headers on success, false on failure.
3677   */
3678  function wp_get_http( $url, $file_path = false, $red = 1 ) {
3679      _deprecated_function( __FUNCTION__, '4.4.0', 'WP_Http' );
3680  
3681      // Add 60 seconds to the script timeout to ensure the remote request has enough time.
3682      if ( function_exists( 'set_time_limit' ) ) {
3683          @set_time_limit( 60 );
3684      }
3685  
3686      if ( $red > 5 )
3687          return false;
3688  
3689      $options = array();
3690      $options['redirection'] = 5;
3691  
3692      if ( false == $file_path )
3693          $options['method'] = 'HEAD';
3694      else
3695          $options['method'] = 'GET';
3696  
3697      $response = wp_safe_remote_request( $url, $options );
3698  
3699      if ( is_wp_error( $response ) )
3700          return false;
3701  
3702      $headers = wp_remote_retrieve_headers( $response );
3703      $headers['response'] = wp_remote_retrieve_response_code( $response );
3704  
3705      // WP_HTTP no longer follows redirects for HEAD requests.
3706      if ( 'HEAD' == $options['method'] && in_array($headers['response'], array(301, 302)) && isset( $headers['location'] ) ) {
3707          return wp_get_http( $headers['location'], $file_path, ++$red );
3708      }
3709  
3710      if ( false == $file_path )
3711          return $headers;
3712  
3713      // GET request - write it to the supplied filename.
3714      $out_fp = fopen($file_path, 'w');
3715      if ( !$out_fp )
3716          return $headers;
3717  
3718      fwrite( $out_fp,  wp_remote_retrieve_body( $response ) );
3719      fclose($out_fp);
3720      clearstatcache();
3721  
3722      return $headers;
3723  }
3724  
3725  /**
3726   * Whether SSL login should be forced.
3727   *
3728   * @since 2.6.0
3729   * @deprecated 4.4.0 Use force_ssl_admin()
3730   * @see force_ssl_admin()
3731   *
3732   * @param string|bool $force Optional Whether to force SSL login. Default null.
3733   * @return bool True if forced, false if not forced.
3734   */
3735  function force_ssl_login( $force = null ) {
3736      _deprecated_function( __FUNCTION__, '4.4.0', 'force_ssl_admin()' );
3737      return force_ssl_admin( $force );
3738  }
3739  
3740  /**
3741   * Retrieve path of comment popup template in current or parent template.
3742   *
3743   * @since 1.5.0
3744   * @deprecated 4.5.0
3745   *
3746   * @return string Full path to comments popup template file.
3747   */
3748  function get_comments_popup_template() {
3749      _deprecated_function( __FUNCTION__, '4.5.0' );
3750  
3751      return '';
3752  }
3753  
3754  /**
3755   * Determines whether the current URL is within the comments popup window.
3756   *
3757   * For more information on this and similar theme functions, check out
3758   * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/
3759   * Conditional Tags} article in the Theme Developer Handbook.
3760   *
3761   * @since 1.5.0
3762   * @deprecated 4.5.0
3763   *
3764   * @return false Always returns false.
3765   */
3766  function is_comments_popup() {
3767      _deprecated_function( __FUNCTION__, '4.5.0' );
3768  
3769      return false;
3770  }
3771  
3772  /**
3773   * Display the JS popup script to show a comment.
3774   *
3775   * @since 0.71
3776   * @deprecated 4.5.0
3777   */
3778  function comments_popup_script() {
3779      _deprecated_function( __FUNCTION__, '4.5.0' );
3780  }
3781  
3782  /**
3783   * Adds element attributes to open links in new tabs.
3784   *
3785   * @since 0.71
3786   * @deprecated 4.5.0
3787   *
3788   * @param string $text Content to replace links to open in a new tab.
3789   * @return string Content that has filtered links.
3790   */
3791  function popuplinks( $text ) {
3792      _deprecated_function( __FUNCTION__, '4.5.0' );
3793      $text = preg_replace('/<a (.+?)>/i', "<a $1 target='_blank' rel='external'>", $text);
3794      return $text;
3795  }
3796  
3797  /**
3798   * The Google Video embed handler callback.
3799   *
3800   * Deprecated function that previously assisted in turning Google Video URLs
3801   * into embeds but that service has since been shut down.
3802   *
3803   * @since 2.9.0
3804   * @deprecated 4.6.0
3805   *
3806   * @return string An empty string.
3807   */
3808  function wp_embed_handler_googlevideo( $matches, $attr, $url, $rawattr ) {
3809      _deprecated_function( __FUNCTION__, '4.6.0' );
3810  
3811      return '';
3812  }
3813  
3814  /**
3815   * Retrieve path of paged template in current or parent template.
3816   *
3817   * @since 1.5.0
3818   * @deprecated 4.7.0 The paged.php template is no longer part of the theme template hierarchy.
3819   *
3820   * @return string Full path to paged template file.
3821   */
3822  function get_paged_template() {
3823      _deprecated_function( __FUNCTION__, '4.7.0' );
3824  
3825      return get_query_template( 'paged' );
3826  }
3827  
3828  /**
3829   * Removes the HTML JavaScript entities found in early versions of Netscape 4.
3830   *
3831   * Previously, this function was pulled in from the original
3832   * import of kses and removed a specific vulnerability only
3833   * existent in early version of Netscape 4. However, this
3834   * vulnerability never affected any other browsers and can
3835   * be considered safe for the modern web.
3836   *
3837   * The regular expression which sanitized this vulnerability
3838   * has been removed in consideration of the performance and
3839   * energy demands it placed, now merely passing through its
3840   * input to the return.
3841   *
3842   * @since 1.0.0
3843   * @deprecated 4.7.0 Officially dropped security support for Netscape 4.
3844   *
3845   * @param string $content
3846   * @return string
3847   */
3848  function wp_kses_js_entities( $content ) {
3849      _deprecated_function( __FUNCTION__, '4.7.0' );
3850  
3851      return preg_replace( '%&\s*\{[^}]*(\}\s*;?|$)%', '', $content );
3852  }
3853  
3854  /**
3855   * Sort categories by ID.
3856   *
3857   * Used by usort() as a callback, should not be used directly. Can actually be
3858   * used to sort any term object.
3859   *
3860   * @since 2.3.0
3861   * @deprecated 4.7.0 Use wp_list_sort()
3862   * @access private
3863   *
3864   * @param object $a
3865   * @param object $b
3866   * @return int
3867   */
3868  function _usort_terms_by_ID( $a, $b ) {
3869      _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' );
3870  
3871      if ( $a->term_id > $b->term_id )
3872          return 1;
3873      elseif ( $a->term_id < $b->term_id )
3874          return -1;
3875      else
3876          return 0;
3877  }
3878  
3879  /**
3880   * Sort categories by name.
3881   *
3882   * Used by usort() as a callback, should not be used directly. Can actually be
3883   * used to sort any term object.
3884   *
3885   * @since 2.3.0
3886   * @deprecated 4.7.0 Use wp_list_sort()
3887   * @access private
3888   *
3889   * @param object $a
3890   * @param object $b
3891   * @return int
3892   */
3893  function _usort_terms_by_name( $a, $b ) {
3894      _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' );
3895  
3896      return strcmp( $a->name, $b->name );
3897  }
3898  
3899  /**
3900   * Sort menu items by the desired key.
3901   *
3902   * @since 3.0.0
3903   * @deprecated 4.7.0 Use wp_list_sort()
3904   * @access private
3905   *
3906   * @global string $_menu_item_sort_prop
3907   *
3908   * @param object $a The first object to compare
3909   * @param object $b The second object to compare
3910   * @return int -1, 0, or 1 if $a is considered to be respectively less than, equal to, or greater than $b.
3911   */
3912  function _sort_nav_menu_items( $a, $b ) {
3913      global $_menu_item_sort_prop;
3914  
3915      _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort()' );
3916  
3917      if ( empty( $_menu_item_sort_prop ) )
3918          return 0;
3919  
3920      if ( ! isset( $a->$_menu_item_sort_prop ) || ! isset( $b->$_menu_item_sort_prop ) )
3921          return 0;
3922  
3923      $_a = (int) $a->$_menu_item_sort_prop;
3924      $_b = (int) $b->$_menu_item_sort_prop;
3925  
3926      if ( $a->$_menu_item_sort_prop == $b->$_menu_item_sort_prop )
3927          return 0;
3928      elseif ( $_a == $a->$_menu_item_sort_prop && $_b == $b->$_menu_item_sort_prop )
3929          return $_a < $_b ? -1 : 1;
3930      else
3931          return strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop );
3932  }
3933  
3934  /**
3935   * Retrieves the Press This bookmarklet link.
3936   *
3937   * @since 2.6.0
3938   * @deprecated 4.9.0
3939   * @return string
3940   */
3941  function get_shortcut_link() {
3942      _deprecated_function( __FUNCTION__, '4.9.0' );
3943  
3944      $link = '';
3945  
3946      /**
3947       * Filters the Press This bookmarklet link.
3948       *
3949       * @since 2.6.0
3950       * @deprecated 4.9.0
3951       *
3952       * @param string $link The Press This bookmarklet link.
3953       */
3954      return apply_filters( 'shortcut_link', $link );
3955  }
3956  
3957  /**
3958   * Ajax handler for saving a post from Press This.
3959   *
3960   * @since 4.2.0
3961   * @deprecated 4.9.0
3962   */
3963  function wp_ajax_press_this_save_post() {
3964      _deprecated_function( __FUNCTION__, '4.9.0' );
3965      if ( is_plugin_active( 'press-this/press-this-plugin.php' ) ) {
3966          include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php';
3967          $wp_press_this = new WP_Press_This_Plugin();
3968          $wp_press_this->save_post();
3969      } else {
3970          wp_send_json_error( array( 'errorMessage' => __( 'The Press This plugin is required.' ) ) );
3971      }
3972  }
3973  
3974  /**
3975   * Ajax handler for creating new category from Press This.
3976   *
3977   * @since 4.2.0
3978   * @deprecated 4.9.0
3979   */
3980  function wp_ajax_press_this_add_category() {
3981      _deprecated_function( __FUNCTION__, '4.9.0' );
3982      if ( is_plugin_active( 'press-this/press-this-plugin.php' ) ) {
3983          include WP_PLUGIN_DIR . '/press-this/class-wp-press-this-plugin.php';
3984          $wp_press_this = new WP_Press_This_Plugin();
3985          $wp_press_this->add_category();
3986      } else {
3987          wp_send_json_error( array( 'errorMessage' => __( 'The Press This plugin is required.' ) ) );
3988      }
3989  }
3990  
3991  /**
3992   * Return the user request object for the specified request ID.
3993   *
3994   * @since 4.9.6
3995   * @deprecated 5.4.0 Use wp_get_user_request()
3996   * @see wp_get_user_request()
3997   *
3998   * @param int $request_id The ID of the user request.
3999   * @return WP_User_Request|false
4000   */
4001  function wp_get_user_request_data( $request_id ) {
4002      _deprecated_function( __FUNCTION__, '5.4.0', 'wp_get_user_request()' );
4003      return wp_get_user_request( $request_id );
4004  }
4005  
4006  /**
4007   * Filters 'img' elements in post content to add 'srcset' and 'sizes' attributes.
4008   *
4009   * @since 4.4.0
4010   * @deprecated 5.5.0
4011   *
4012   * @see wp_image_add_srcset_and_sizes()
4013   *
4014   * @param string $content The raw post content to be filtered.
4015   * @return string Converted content with 'srcset' and 'sizes' attributes added to images.
4016   */
4017  function wp_make_content_images_responsive( $content ) {
4018      _deprecated_function( __FUNCTION__, '5.5.0', 'wp_filter_content_tags()' );
4019  
4020      // This will also add the `loading` attribute to `img` tags, if enabled.
4021      return wp_filter_content_tags( $content );
4022  }
4023  
4024  /**
4025   * Turn register globals off.
4026   *
4027   * @since 2.1.0
4028   * @access private
4029   * @deprecated 5.5.0
4030   */
4031  function wp_unregister_GLOBALS() {
4032      // register_globals was deprecated in PHP 5.3 and removed entirely in PHP 5.4.
4033      _deprecated_function( __FUNCTION__, '5.5.0' );
4034  }
4035  
4036  /**
4037   * Does comment contain disallowed characters or words.
4038   *
4039   * @since 1.5.0
4040   * @deprecated 5.5.0 Use wp_check_comment_disallowed_list() instead.
4041   *                   Please consider writing more inclusive code.
4042   *
4043   * @param string $author The author of the comment
4044   * @param string $email The email of the comment
4045   * @param string $url The url used in the comment
4046   * @param string $comment The comment content
4047   * @param string $user_ip The comment author's IP address
4048   * @param string $user_agent The author's browser user agent
4049   * @return bool True if comment contains disallowed content, false if comment does not
4050   */
4051  function wp_blacklist_check( $author, $email, $url, $comment, $user_ip, $user_agent ) {
4052      _deprecated_function( __FUNCTION__, '5.5.0', 'wp_check_comment_disallowed_list()' );
4053  
4054      return wp_check_comment_disallowed_list( $author, $email, $url, $comment, $user_ip, $user_agent );
4055  }
4056  
4057  /**
4058   * Filters out `register_meta()` args based on an allowed list.
4059   *
4060   * `register_meta()` args may change over time, so requiring the allowed list
4061   * to be explicitly turned off is a warranty seal of sorts.
4062   *
4063   * @access private
4064   * @since 4.6.0
4065   * @deprecated 5.5.0 Use _wp_register_meta_args_allowed_list() instead.
4066   *                   Please consider writing more inclusive code.
4067   *
4068   * @param array $args         Arguments from `register_meta()`.
4069   * @param array $default_args Default arguments for `register_meta()`.
4070   * @return array Filtered arguments.
4071   */
4072  function _wp_register_meta_args_whitelist( $args, $default_args ) {
4073      _deprecated_function( __FUNCTION__, '5.5.0', '_wp_register_meta_args_allowed_list()' );
4074  
4075      return _wp_register_meta_args_allowed_list( $args, $default_args );
4076  }
4077  
4078  /**
4079   * Adds an array of options to the list of allowed options.
4080   *
4081   * @since 2.7.0
4082   * @deprecated 5.5.0 Use add_allowed_options() instead.
4083   *                   Please consider writing more inclusive code.
4084   *
4085   * @param array        $new_options
4086   * @param string|array $options
4087   * @return array
4088   */
4089  function add_option_whitelist( $new_options, $options = '' ) {
4090      _deprecated_function( __FUNCTION__, '5.5.0', 'add_allowed_options()' );
4091  
4092      return add_allowed_options( $new_options, $options );
4093  }
4094  
4095  /**
4096   * Removes a list of options from the allowed options list.
4097   *
4098   * @since 2.7.0
4099   * @deprecated 5.5.0 Use remove_allowed_options() instead.
4100   *                   Please consider writing more inclusive code.
4101   *
4102   * @param array        $del_options
4103   * @param string|array $options
4104   * @return array
4105   */
4106  function remove_option_whitelist( $del_options, $options = '' ) {
4107      _deprecated_function( __FUNCTION__, '5.5.0', 'remove_allowed_options()' );
4108  
4109      return remove_allowed_options( $del_options, $options );
4110  }
4111  
4112  /**
4113   * Adds slashes to only string values in an array of values.
4114   *
4115   * This should be used when preparing data for core APIs that expect slashed data.
4116   * This should not be used to escape data going directly into an SQL query.
4117   *
4118   * @since 5.3.0
4119   * @deprecated 5.6.0 Use wp_slash()
4120   *
4121   * @see wp_slash()
4122   *
4123   * @param mixed $value Scalar or array of scalars.
4124   * @return mixed Slashes $value
4125   */
4126  function wp_slash_strings_only( $value ) {
4127      return map_deep( $value, 'addslashes_strings_only' );
4128  }
4129  
4130  /**
4131   * Adds slashes only if the provided value is a string.
4132   *
4133   * @since 5.3.0
4134   * @deprecated 5.6.0
4135   *
4136   * @see wp_slash()
4137   *
4138   * @param mixed $value
4139   * @return mixed
4140   */
4141  function addslashes_strings_only( $value ) {
4142      return is_string( $value ) ? addslashes( $value ) : $value;
4143  }
4144  
4145  /**
4146   * Displays a `noindex` meta tag if required by the blog configuration.
4147   *
4148   * If a blog is marked as not being public then the `noindex` meta tag will be
4149   * output to tell web robots not to index the page content.
4150   *
4151   * Typical usage is as a {@see 'wp_head'} callback:
4152   *
4153   *     add_action( 'wp_head', 'noindex' );
4154   *
4155   * @see wp_no_robots()
4156   *
4157   * @since 2.1.0
4158   * @deprecated 5.7.0 Use wp_robots_noindex() instead on 'wp_robots' filter.
4159   */
4160  function noindex() {
4161      _deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_noindex()' );
4162  
4163      // If the blog is not public, tell robots to go away.
4164      if ( '0' == get_option( 'blog_public' ) ) {
4165          wp_no_robots();
4166      }
4167  }
4168  
4169  /**
4170   * Display a `noindex` meta tag.
4171   *
4172   * Outputs a `noindex` meta tag that tells web robots not to index the page content.
4173   *
4174   * Typical usage is as a {@see 'wp_head'} callback:
4175   *
4176   *     add_action( 'wp_head', 'wp_no_robots' );
4177   *
4178   * @since 3.3.0
4179   * @since 5.3.0 Echo `noindex,nofollow` if search engine visibility is discouraged.
4180   * @deprecated 5.7.0 Use wp_robots_no_robots() instead on 'wp_robots' filter.
4181   */
4182  function wp_no_robots() {
4183      _deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_no_robots()' );
4184  
4185      if ( get_option( 'blog_public' ) ) {
4186          echo "<meta name='robots' content='noindex,follow' />\n";
4187          return;
4188      }
4189  
4190      echo "<meta name='robots' content='noindex,nofollow' />\n";
4191  }
4192  
4193  /**
4194   * Display a `noindex,noarchive` meta tag and referrer `strict-origin-when-cross-origin` meta tag.
4195   *
4196   * Outputs a `noindex,noarchive` meta tag that tells web robots not to index or cache the page content.
4197   * Outputs a referrer `strict-origin-when-cross-origin` meta tag that tells the browser not to send
4198   * the full URL as a referrer to other sites when cross-origin assets are loaded.
4199   *
4200   * Typical usage is as a {@see 'wp_head'} callback:
4201   *
4202   *     add_action( 'wp_head', 'wp_sensitive_page_meta' );
4203   *
4204   * @since 5.0.1
4205   * @deprecated 5.7.0 Use wp_robots_sensitive_page() instead on 'wp_robots' filter
4206   *                   and wp_strict_cross_origin_referrer() on 'wp_head' action.
4207   *
4208   * @see wp_robots_sensitive_page()
4209   */
4210  function wp_sensitive_page_meta() {
4211      _deprecated_function( __FUNCTION__, '5.7.0', 'wp_robots_sensitive_page()' );
4212  
4213      ?>
4214      <meta name='robots' content='noindex,noarchive' />
4215      <?php
4216      wp_strict_cross_origin_referrer();
4217  }
4218  
4219  /**
4220   * Render inner blocks from the `core/columns` block for generating an excerpt.
4221   *
4222   * @since 5.2.0
4223   * @access private
4224   * @deprecated 5.8.0 Use _excerpt_render_inner_blocks() introduced in 5.8.0.
4225   *
4226   * @see _excerpt_render_inner_blocks()
4227   *
4228   * @param array $columns        The parsed columns block.
4229   * @param array $allowed_blocks The list of allowed inner blocks.
4230   * @return string The rendered inner blocks.
4231   */
4232  function _excerpt_render_inner_columns_blocks( $columns, $allowed_blocks ) {
4233      _deprecated_function( __FUNCTION__, '5.8.0', '_excerpt_render_inner_blocks()' );
4234  
4235      return _excerpt_render_inner_blocks( $columns, $allowed_blocks );
4236  }
4237  
4238  /**
4239   * Renders the duotone filter SVG and returns the CSS filter property to
4240   * reference the rendered SVG.
4241   *
4242   * @since 5.9.0
4243   * @deprecated 5.9.1 Use wp_get_duotone_filter_property() introduced in 5.9.1.
4244   *
4245   * @see wp_get_duotone_filter_property()
4246   *
4247   * @param array $preset Duotone preset value as seen in theme.json.
4248   * @return string Duotone CSS filter property.
4249   */
4250  function wp_render_duotone_filter_preset( $preset ) {
4251      _deprecated_function( __FUNCTION__, '5.9.1', 'wp_get_duotone_filter_property()' );
4252  
4253      return wp_get_duotone_filter_property( $preset );
4254  }
4255  
4256  /**
4257   * Checks whether serialization of the current block's border properties should occur.
4258   *
4259   * @since 5.8.0
4260   * @access private
4261   * @deprecated 6.0.0 Use wp_should_skip_block_supports_serialization() introduced in 6.0.0.
4262   *
4263   * @see wp_should_skip_block_supports_serialization()
4264   *
4265   * @param WP_Block_Type $block_type Block type.
4266   * @return bool Whether serialization of the current block's border properties
4267   *              should occur.
4268   */
4269  function wp_skip_border_serialization( $block_type ) {
4270      _deprecated_function( __FUNCTION__, '6.0.0', 'wp_should_skip_block_supports_serialization()' );
4271  
4272      $border_support = $block_type->supports['__experimentalBorder'] ?? false;
4273  
4274      return is_array( $border_support ) &&
4275          array_key_exists( '__experimentalSkipSerialization', $border_support ) &&
4276          $border_support['__experimentalSkipSerialization'];
4277  }
4278  
4279  /**
4280   * Checks whether serialization of the current block's dimensions properties should occur.
4281   *
4282   * @since 5.9.0
4283   * @access private
4284   * @deprecated 6.0.0 Use wp_should_skip_block_supports_serialization() introduced in 6.0.0.
4285   *
4286   * @see wp_should_skip_block_supports_serialization()
4287   *
4288   * @param WP_Block_type $block_type Block type.
4289   * @return bool Whether to serialize spacing support styles & classes.
4290   */
4291  function wp_skip_dimensions_serialization( $block_type ) {
4292      _deprecated_function( __FUNCTION__, '6.0.0', 'wp_should_skip_block_supports_serialization()' );
4293  
4294      $dimensions_support = $block_type->supports['__experimentalDimensions'] ?? false;
4295  
4296      return is_array( $dimensions_support ) &&
4297          array_key_exists( '__experimentalSkipSerialization', $dimensions_support ) &&
4298          $dimensions_support['__experimentalSkipSerialization'];
4299  }
4300  
4301  /**
4302   * Checks whether serialization of the current block's spacing properties should occur.
4303   *
4304   * @since 5.9.0
4305   * @access private
4306   * @deprecated 6.0.0 Use wp_should_skip_block_supports_serialization() introduced in 6.0.0.
4307   *
4308   * @see wp_should_skip_block_supports_serialization()
4309   *
4310   * @param WP_Block_Type $block_type Block type.
4311   * @return bool Whether to serialize spacing support styles & classes.
4312   */
4313  function wp_skip_spacing_serialization( $block_type ) {
4314      _deprecated_function( __FUNCTION__, '6.0.0', 'wp_should_skip_block_supports_serialization()' );
4315  
4316      $spacing_support = $block_type->supports['spacing'] ?? false;
4317  
4318      return is_array( $spacing_support ) &&
4319          array_key_exists( '__experimentalSkipSerialization', $spacing_support ) &&
4320          $spacing_support['__experimentalSkipSerialization'];
4321  }
4322  
4323  /**
4324   * Inject the block editor assets that need to be loaded into the editor's iframe as an inline script.
4325   *
4326   * @since 5.8.0
4327   * @deprecated 6.0.0
4328   */
4329  function wp_add_iframed_editor_assets_html() {
4330      _deprecated_function( __FUNCTION__, '6.0.0' );
4331  }
4332  
4333  /**
4334   * Retrieves thumbnail for an attachment.
4335   * Note that this works only for the (very) old image metadata style where 'thumb' was set,
4336   * and the 'sizes' array did not exist. This function returns false for the newer image metadata style
4337   * despite that 'thumbnail' is present in the 'sizes' array.
4338   *
4339   * @since 2.1.0
4340   * @deprecated 6.1.0
4341   *
4342   * @param int $post_id Optional. Attachment ID. Default is the ID of the global `$post`.
4343   * @return string|false Thumbnail file path on success, false on failure.
4344   */
4345  function wp_get_attachment_thumb_file( $post_id = 0 ) {
4346      _deprecated_function( __FUNCTION__, '6.1.0' );
4347  
4348      $post_id = (int) $post_id;
4349      $post    = get_post( $post_id );
4350  
4351      if ( ! $post ) {
4352          return false;
4353      }
4354  
4355      // Use $post->ID rather than $post_id as get_post() may have used the global $post object.
4356      $imagedata = wp_get_attachment_metadata( $post->ID );
4357  
4358      if ( ! is_array( $imagedata ) ) {
4359          return false;
4360      }
4361  
4362      $file = get_attached_file( $post->ID );
4363  
4364      if ( ! empty( $imagedata['thumb'] ) ) {
4365          $thumbfile = str_replace( wp_basename( $file ), $imagedata['thumb'], $file );
4366          if ( file_exists( $thumbfile ) ) {
4367              /**
4368               * Filters the attachment thumbnail file path.
4369               *
4370               * @since 2.1.0
4371               *
4372               * @param string $thumbfile File path to the attachment thumbnail.
4373               * @param int    $post_id   Attachment ID.
4374               */
4375              return apply_filters( 'wp_get_attachment_thumb_file', $thumbfile, $post->ID );
4376          }
4377      }
4378  
4379      return false;
4380  }
4381  
4382  /**
4383   * Gets the path to a translation file for loading a textdomain just in time.
4384   *
4385   * Caches the retrieved results internally.
4386   *
4387   * @since 4.7.0
4388   * @deprecated 6.1.0
4389   * @access private
4390   *
4391   * @see _load_textdomain_just_in_time()
4392   *
4393   * @param string $domain Text domain. Unique identifier for retrieving translated strings.
4394   * @param bool   $reset  Whether to reset the internal cache. Used by the switch to locale functionality.
4395   * @return string|false The path to the translation file or false if no translation file was found.
4396   */
4397  function _get_path_to_translation( $domain, $reset = false ) {
4398      _deprecated_function( __FUNCTION__, '6.1.0', 'WP_Textdomain_Registry' );
4399  
4400      static $available_translations = array();
4401  
4402      if ( true === $reset ) {
4403          $available_translations = array();
4404      }
4405  
4406      if ( ! isset( $available_translations[ $domain ] ) ) {
4407          $available_translations[ $domain ] = _get_path_to_translation_from_lang_dir( $domain );
4408      }
4409  
4410      return $available_translations[ $domain ];
4411  }
4412  
4413  /**
4414   * Gets the path to a translation file in the languages directory for the current locale.
4415   *
4416   * Holds a cached list of available .mo files to improve performance.
4417   *
4418   * @since 4.7.0
4419   * @deprecated 6.1.0
4420   * @access private
4421   *
4422   * @see _get_path_to_translation()
4423   *
4424   * @param string $domain Text domain. Unique identifier for retrieving translated strings.
4425   * @return string|false The path to the translation file or false if no translation file was found.
4426   */
4427  function _get_path_to_translation_from_lang_dir( $domain ) {
4428      _deprecated_function( __FUNCTION__, '6.1.0', 'WP_Textdomain_Registry' );
4429  
4430      static $cached_mofiles = null;
4431  
4432      if ( null === $cached_mofiles ) {
4433          $cached_mofiles = array();
4434  
4435          $locations = array(
4436              WP_LANG_DIR . '/plugins',
4437              WP_LANG_DIR . '/themes',
4438          );
4439  
4440          foreach ( $locations as $location ) {
4441              $mofiles = glob( $location . '/*.mo' );
4442              if ( $mofiles ) {
4443                  $cached_mofiles = array_merge( $cached_mofiles, $mofiles );
4444              }
4445          }
4446      }
4447  
4448      $locale = determine_locale();
4449      $mofile = "{$domain}-{$locale}.mo";
4450  
4451      $path = WP_LANG_DIR . '/plugins/' . $mofile;
4452      if ( in_array( $path, $cached_mofiles, true ) ) {
4453          return $path;
4454      }
4455  
4456      $path = WP_LANG_DIR . '/themes/' . $mofile;
4457      if ( in_array( $path, $cached_mofiles, true ) ) {
4458          return $path;
4459      }
4460  
4461      return false;
4462  }
4463  
4464  /**
4465   * Allows multiple block styles.
4466   *
4467   * @since 5.9.0
4468   * @deprecated 6.1.0
4469   *
4470   * @param array $metadata Metadata for registering a block type.
4471   * @return array Metadata for registering a block type.
4472   */
4473  function _wp_multiple_block_styles( $metadata ) {
4474      _deprecated_function( __FUNCTION__, '6.1.0' );
4475      return $metadata;
4476  }
4477  
4478  /**
4479   * Generates an inline style for a typography feature e.g. text decoration,
4480   * text transform, and font style.
4481   *
4482   * @since 5.8.0
4483   * @access private
4484   * @deprecated 6.1.0 Use wp_style_engine_get_styles() introduced in 6.1.0.
4485   *
4486   * @see wp_style_engine_get_styles()
4487   *
4488   * @param array  $attributes   Block's attributes.
4489   * @param string $feature      Key for the feature within the typography styles.
4490   * @param string $css_property Slug for the CSS property the inline style sets.
4491   * @return string CSS inline style.
4492   */
4493  function wp_typography_get_css_variable_inline_style( $attributes, $feature, $css_property ) {
4494      _deprecated_function( __FUNCTION__, '6.1.0', 'wp_style_engine_get_styles()' );
4495  
4496      // Retrieve current attribute value or skip if not found.
4497      $style_value = _wp_array_get( $attributes, array( 'style', 'typography', $feature ), false );
4498      if ( ! $style_value ) {
4499          return;
4500      }
4501  
4502      // If we don't have a preset CSS variable, we'll assume it's a regular CSS value.
4503      if ( ! str_contains( $style_value, "var:preset|{$css_property}|" ) ) {
4504          return sprintf( '%s:%s;', $css_property, $style_value );
4505      }
4506  
4507      /*
4508       * We have a preset CSS variable as the style.
4509       * Get the style value from the string and return CSS style.
4510       */
4511      $index_to_splice = strrpos( $style_value, '|' ) + 1;
4512      $slug            = substr( $style_value, $index_to_splice );
4513  
4514      // Return the actual CSS inline style e.g. `text-decoration:var(--wp--preset--text-decoration--underline);`.
4515      return sprintf( '%s:var(--wp--preset--%s--%s);', $css_property, $css_property, $slug );
4516  }
4517  
4518  /**
4519   * Determines whether global terms are enabled.
4520   *
4521   * @since 3.0.0
4522   * @since 6.1.0 This function now always returns false.
4523   * @deprecated 6.1.0
4524   *
4525   * @return bool Always returns false.
4526   */
4527  function global_terms_enabled() {
4528      _deprecated_function( __FUNCTION__, '6.1.0' );
4529  
4530      return false;
4531  }
4532  
4533  /**
4534   * Filter the SQL clauses of an attachment query to include filenames.
4535   *
4536   * @since 4.7.0
4537   * @deprecated 6.0.3
4538   * @access private
4539   *
4540   * @param array $clauses An array including WHERE, GROUP BY, JOIN, ORDER BY,
4541   *                       DISTINCT, fields (SELECT), and LIMITS clauses.
4542   * @return array The unmodified clauses.
4543   */
4544  function _filter_query_attachment_filenames( $clauses ) {
4545      _deprecated_function( __FUNCTION__, '6.0.3', 'add_filter( "wp_allow_query_attachment_by_filename", "__return_true" )' );
4546      remove_filter( 'posts_clauses', __FUNCTION__ );
4547      return $clauses;
4548  }
4549  
4550  /**
4551   * Retrieves a page given its title.
4552   *
4553   * If more than one post uses the same title, the post with the smallest ID will be returned.
4554   * Be careful: in case of more than one post having the same title, it will check the oldest
4555   * publication date, not the smallest ID.
4556   *
4557   * Because this function uses the MySQL '=' comparison, $page_title will usually be matched
4558   * as case-insensitive with default collation.
4559   *
4560   * @since 2.1.0
4561   * @since 3.0.0 The `$post_type` parameter was added.
4562   * @deprecated 6.2.0 Use WP_Query.
4563   *
4564   * @global wpdb $wpdb WordPress database abstraction object.
4565   *
4566   * @param string       $page_title Page title.
4567   * @param string       $output     Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
4568   *                                 correspond to a WP_Post object, an associative array, or a numeric array,
4569   *                                 respectively. Default OBJECT.
4570   * @param string|array $post_type  Optional. Post type or array of post types. Default 'page'.
4571   * @return WP_Post|array|null WP_Post (or array) on success, or null on failure.
4572   */
4573  function get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' ) {
4574      _deprecated_function( __FUNCTION__, '6.2.0', 'WP_Query' );
4575      global $wpdb;
4576  
4577      if ( is_array( $post_type ) ) {
4578          $post_type           = esc_sql( $post_type );
4579          $post_type_in_string = "'" . implode( "','", $post_type ) . "'";
4580          $sql                 = $wpdb->prepare(
4581              "SELECT ID
4582              FROM $wpdb->posts
4583              WHERE post_title = %s
4584              AND post_type IN ($post_type_in_string)",
4585              $page_title
4586          );
4587      } else {
4588          $sql = $wpdb->prepare(
4589              "SELECT ID
4590              FROM $wpdb->posts
4591              WHERE post_title = %s
4592              AND post_type = %s",
4593              $page_title,
4594              $post_type
4595          );
4596      }
4597  
4598      $page = $wpdb->get_var( $sql );
4599  
4600      if ( $page ) {
4601          return get_post( $page, $output );
4602      }
4603  
4604      return null;
4605  }
4606  
4607  /**
4608   * Returns the correct template for the site's home page.
4609   *
4610   * @access private
4611   * @since 6.0.0
4612   * @deprecated 6.2.0 Site Editor's server-side redirect for missing postType and postId
4613   *                   query args is removed. Thus, this function is no longer used.
4614   *
4615   * @return array|null A template object, or null if none could be found.
4616   */
4617  function _resolve_home_block_template() {
4618      _deprecated_function( __FUNCTION__, '6.2.0' );
4619  
4620      $show_on_front = get_option( 'show_on_front' );
4621      $front_page_id = get_option( 'page_on_front' );
4622  
4623      if ( 'page' === $show_on_front && $front_page_id ) {
4624          return array(
4625                  'postType' => 'page',
4626                  'postId'   => $front_page_id,
4627          );
4628      }
4629  
4630      $hierarchy = array( 'front-page', 'home', 'index' );
4631      $template  = resolve_block_template( 'home', $hierarchy, '' );
4632  
4633      if ( ! $template ) {
4634          return null;
4635      }
4636  
4637      return array(
4638              'postType' => 'wp_template',
4639              'postId'   => $template->id,
4640      );
4641  }
4642  
4643  /**
4644   * Displays the link to the Windows Live Writer manifest file.
4645   *
4646   * @link https://msdn.microsoft.com/en-us/library/bb463265.aspx
4647   * @since 2.3.1
4648   * @deprecated 6.3.0 WLW manifest is no longer in use and no longer included in core,
4649   *                   so the output from this function is removed.
4650   */
4651  function wlwmanifest_link() {
4652      _deprecated_function( __FUNCTION__, '6.3.0' );
4653  }
4654  
4655  /**
4656   * Queues comments for metadata lazy-loading.
4657   *
4658   * @since 4.5.0
4659   * @deprecated 6.3.0 Use wp_lazyload_comment_meta() instead.
4660   *
4661   * @param WP_Comment[] $comments Array of comment objects.
4662   */
4663  function wp_queue_comments_for_comment_meta_lazyload( $comments ) {
4664      _deprecated_function( __FUNCTION__, '6.3.0', 'wp_lazyload_comment_meta()' );
4665      // Don't use `wp_list_pluck()` to avoid by-reference manipulation.
4666      $comment_ids = array();
4667      if ( is_array( $comments ) ) {
4668          foreach ( $comments as $comment ) {
4669              if ( $comment instanceof WP_Comment ) {
4670                  $comment_ids[] = $comment->comment_ID;
4671              }
4672          }
4673      }
4674  
4675      wp_lazyload_comment_meta( $comment_ids );
4676  }
4677  
4678  /**
4679   * Gets the default value to use for a `loading` attribute on an element.
4680   *
4681   * This function should only be called for a tag and context if lazy-loading is generally enabled.
4682   *
4683   * The function usually returns 'lazy', but uses certain heuristics to guess whether the current element is likely to
4684   * appear above the fold, in which case it returns a boolean `false`, which will lead to the `loading` attribute being
4685   * omitted on the element. The purpose of this refinement is to avoid lazy-loading elements that are within the initial
4686   * viewport, which can have a negative performance impact.
4687   *
4688   * Under the hood, the function uses {@see wp_increase_content_media_count()} every time it is called for an element
4689   * within the main content. If the element is the very first content element, the `loading` attribute will be omitted.
4690   * This default threshold of 3 content elements to omit the `loading` attribute for can be customized using the
4691   * {@see 'wp_omit_loading_attr_threshold'} filter.
4692   *
4693   * @since 5.9.0
4694   * @deprecated 6.3.0 Use wp_get_loading_optimization_attributes() instead.
4695   * @see wp_get_loading_optimization_attributes()
4696   *
4697   * @global WP_Query $wp_query WordPress Query object.
4698   *
4699   * @param string $context Context for the element for which the `loading` attribute value is requested.
4700   * @return string|bool The default `loading` attribute value. Either 'lazy', 'eager', or a boolean `false`, to indicate
4701   *                     that the `loading` attribute should be skipped.
4702   */
4703  function wp_get_loading_attr_default( $context ) {
4704      _deprecated_function( __FUNCTION__, '6.3.0', 'wp_get_loading_optimization_attributes()' );
4705      global $wp_query;
4706  
4707      // Skip lazy-loading for the overall block template, as it is handled more granularly.
4708      if ( 'template' === $context ) {
4709          return false;
4710      }
4711  
4712      /*
4713       * Do not lazy-load images in the header block template part, as they are likely above the fold.
4714       * For classic themes, this is handled in the condition below using the 'get_header' action.
4715       */
4716      $header_area = WP_TEMPLATE_PART_AREA_HEADER;
4717      if ( "template_part_{$header_area}" === $context ) {
4718          return false;
4719      }
4720  
4721      // Special handling for programmatically created image tags.
4722      if ( 'the_post_thumbnail' === $context || 'wp_get_attachment_image' === $context ) {
4723          /*
4724           * Skip programmatically created images within post content as they need to be handled together with the other
4725           * images within the post content.
4726           * Without this clause, they would already be counted below which skews the number and can result in the first
4727           * post content image being lazy-loaded only because there are images elsewhere in the post content.
4728           */
4729          if ( doing_filter( 'the_content' ) ) {
4730              return false;
4731          }
4732  
4733          // Conditionally skip lazy-loading on images before the loop.
4734          if (
4735              // Only apply for main query but before the loop.
4736              $wp_query->before_loop && $wp_query->is_main_query()
4737              /*
4738               * Any image before the loop, but after the header has started should not be lazy-loaded,
4739               * except when the footer has already started which can happen when the current template
4740               * does not include any loop.
4741               */
4742              && did_action( 'get_header' ) && ! did_action( 'get_footer' )
4743          ) {
4744              return false;
4745          }
4746      }
4747  
4748      /*
4749       * The first elements in 'the_content' or 'the_post_thumbnail' should not be lazy-loaded,
4750       * as they are likely above the fold.
4751       */
4752      if ( 'the_content' === $context || 'the_post_thumbnail' === $context ) {
4753          // Only elements within the main query loop have special handling.
4754          if ( is_admin() || ! in_the_loop() || ! is_main_query() ) {
4755              return 'lazy';
4756          }
4757  
4758          // Increase the counter since this is a main query content element.
4759          $content_media_count = wp_increase_content_media_count();
4760  
4761          // If the count so far is below the threshold, return `false` so that the `loading` attribute is omitted.
4762          if ( $content_media_count <= wp_omit_loading_attr_threshold() ) {
4763              return false;
4764          }
4765  
4766          // For elements after the threshold, lazy-load them as usual.
4767          return 'lazy';
4768      }
4769  
4770      // Lazy-load by default for any unknown context.
4771      return 'lazy';
4772  }
4773  
4774  /**
4775   * Adds `loading` attribute to an `img` HTML tag.
4776   *
4777   * @since 5.5.0
4778   * @deprecated 6.3.0 Use wp_img_tag_add_loading_optimization_attrs() instead.
4779   * @see wp_img_tag_add_loading_optimization_attrs()
4780   *
4781   * @param string $image   The HTML `img` tag where the attribute should be added.
4782   * @param string $context Additional context to pass to the filters.
4783   * @return string Converted `img` tag with `loading` attribute added.
4784   */
4785  function wp_img_tag_add_loading_attr( $image, $context ) {
4786      _deprecated_function( __FUNCTION__, '6.3.0', 'wp_img_tag_add_loading_optimization_attrs()' );
4787      /*
4788       * Get loading attribute value to use. This must occur before the conditional check below so that even images that
4789       * are ineligible for being lazy-loaded are considered.
4790       */
4791      $value = wp_get_loading_attr_default( $context );
4792  
4793      // Images should have source and dimension attributes for the `loading` attribute to be added.
4794      if ( ! str_contains( $image, ' src="' ) || ! str_contains( $image, ' width="' ) || ! str_contains( $image, ' height="' ) ) {
4795          return $image;
4796      }
4797  
4798      /** This filter is documented in wp-includes/media.php */
4799      $value = apply_filters( 'wp_img_tag_add_loading_attr', $value, $image, $context );
4800  
4801      if ( $value ) {
4802          if ( ! in_array( $value, array( 'lazy', 'eager' ), true ) ) {
4803              $value = 'lazy';
4804          }
4805  
4806          return str_replace( '<img', '<img loading="' . esc_attr( $value ) . '"', $image );
4807      }
4808  
4809      return $image;
4810  }
4811  
4812  /**
4813   * Takes input from [0, n] and returns it as [0, 1].
4814   *
4815   * Direct port of TinyColor's function, lightly simplified to maintain
4816   * consistency with TinyColor.
4817   *
4818   * @link https://github.com/bgrins/TinyColor
4819   *
4820   * @since 5.8.0
4821   * @deprecated 6.3.0
4822   *
4823   * @access private
4824   *
4825   * @param mixed $n   Number of unknown type.
4826   * @param int   $max Upper value of the range to bound to.
4827   * @return float Value in the range [0, 1].
4828   */
4829  function wp_tinycolor_bound01( $n, $max ) {
4830      _deprecated_function( __FUNCTION__, '6.3.0' );
4831      if ( 'string' === gettype( $n ) && str_contains( $n, '.' ) && 1 === (float) $n ) {
4832          $n = '100%';
4833      }
4834  
4835      $n = min( $max, max( 0, (float) $n ) );
4836  
4837      // Automatically convert percentage into number.
4838      if ( 'string' === gettype( $n ) && str_contains( $n, '%' ) ) {
4839          $n = (int) ( $n * $max ) / 100;
4840      }
4841  
4842      // Handle floating point rounding errors.
4843      if ( ( abs( $n - $max ) < 0.000001 ) ) {
4844          return 1.0;
4845      }
4846  
4847      // Convert into [0, 1] range if it isn't already.
4848      return ( $n % $max ) / (float) $max;
4849  }
4850  
4851  /**
4852   * Direct port of tinycolor's boundAlpha function to maintain consistency with
4853   * how tinycolor works.
4854   *
4855   * @link https://github.com/bgrins/TinyColor
4856   *
4857   * @since 5.9.0
4858   * @deprecated 6.3.0
4859   *
4860   * @access private
4861   *
4862   * @param mixed $n Number of unknown type.
4863   * @return float Value in the range [0,1].
4864   */
4865  function _wp_tinycolor_bound_alpha( $n ) {
4866      _deprecated_function( __FUNCTION__, '6.3.0' );
4867  
4868      if ( is_numeric( $n ) ) {
4869          $n = (float) $n;
4870          if ( $n >= 0 && $n <= 1 ) {
4871              return $n;
4872          }
4873      }
4874      return 1;
4875  }
4876  
4877  /**
4878   * Rounds and converts values of an RGB object.
4879   *
4880   * Direct port of TinyColor's function, lightly simplified to maintain
4881   * consistency with TinyColor.
4882   *
4883   * @link https://github.com/bgrins/TinyColor
4884   *
4885   * @since 5.8.0
4886   * @deprecated 6.3.0
4887   *
4888   * @access private
4889   *
4890   * @param array $rgb_color RGB object.
4891   * @return array Rounded and converted RGB object.
4892   */
4893  function wp_tinycolor_rgb_to_rgb( $rgb_color ) {
4894      _deprecated_function( __FUNCTION__, '6.3.0' );
4895  
4896      return array(
4897          'r' => wp_tinycolor_bound01( $rgb_color['r'], 255 ) * 255,
4898          'g' => wp_tinycolor_bound01( $rgb_color['g'], 255 ) * 255,
4899          'b' => wp_tinycolor_bound01( $rgb_color['b'], 255 ) * 255,
4900      );
4901  }
4902  
4903  /**
4904   * Helper function for hsl to rgb conversion.
4905   *
4906   * Direct port of TinyColor's function, lightly simplified to maintain
4907   * consistency with TinyColor.
4908   *
4909   * @link https://github.com/bgrins/TinyColor
4910   *
4911   * @since 5.8.0
4912   * @deprecated 6.3.0
4913   *
4914   * @access private
4915   *
4916   * @param float $p first component.
4917   * @param float $q second component.
4918   * @param float $t third component.
4919   * @return float R, G, or B component.
4920   */
4921  function wp_tinycolor_hue_to_rgb( $p, $q, $t ) {
4922      _deprecated_function( __FUNCTION__, '6.3.0' );
4923  
4924      if ( $t < 0 ) {
4925          ++$t;
4926      }
4927      if ( $t > 1 ) {
4928          --$t;
4929      }
4930      if ( $t < 1 / 6 ) {
4931          return $p + ( $q - $p ) * 6 * $t;
4932      }
4933      if ( $t < 1 / 2 ) {
4934          return $q;
4935      }
4936      if ( $t < 2 / 3 ) {
4937          return $p + ( $q - $p ) * ( 2 / 3 - $t ) * 6;
4938      }
4939      return $p;
4940  }
4941  
4942  /**
4943   * Converts an HSL object to an RGB object with converted and rounded values.
4944   *
4945   * Direct port of TinyColor's function, lightly simplified to maintain
4946   * consistency with TinyColor.
4947   *
4948   * @link https://github.com/bgrins/TinyColor
4949   *
4950   * @since 5.8.0
4951   * @deprecated 6.3.0
4952   *
4953   * @access private
4954   *
4955   * @param array $hsl_color HSL object.
4956   * @return array Rounded and converted RGB object.
4957   */
4958  function wp_tinycolor_hsl_to_rgb( $hsl_color ) {
4959      _deprecated_function( __FUNCTION__, '6.3.0' );
4960  
4961      $h = wp_tinycolor_bound01( $hsl_color['h'], 360 );
4962      $s = wp_tinycolor_bound01( $hsl_color['s'], 100 );
4963      $l = wp_tinycolor_bound01( $hsl_color['l'], 100 );
4964  
4965      if ( 0 === $s ) {
4966          // Achromatic.
4967          $r = $l;
4968          $g = $l;
4969          $b = $l;
4970      } else {
4971          $q = $l < 0.5 ? $l * ( 1 + $s ) : $l + $s - $l * $s;
4972          $p = 2 * $l - $q;
4973          $r = wp_tinycolor_hue_to_rgb( $p, $q, $h + 1 / 3 );
4974          $g = wp_tinycolor_hue_to_rgb( $p, $q, $h );
4975          $b = wp_tinycolor_hue_to_rgb( $p, $q, $h - 1 / 3 );
4976      }
4977  
4978      return array(
4979          'r' => $r * 255,
4980          'g' => $g * 255,
4981          'b' => $b * 255,
4982      );
4983  }
4984  
4985  /**
4986   * Parses hex, hsl, and rgb CSS strings using the same regex as TinyColor v1.4.2
4987   * used in the JavaScript. Only colors output from react-color are implemented.
4988   *
4989   * Direct port of TinyColor's function, lightly simplified to maintain
4990   * consistency with TinyColor.
4991   *
4992   * @link https://github.com/bgrins/TinyColor
4993   * @link https://github.com/casesandberg/react-color/
4994   *
4995   * @since 5.8.0
4996   * @since 5.9.0 Added alpha processing.
4997   * @deprecated 6.3.0
4998   *
4999   * @access private
5000   *
5001   * @param string $color_str CSS color string.
5002   * @return array RGB object.
5003   */
5004  function wp_tinycolor_string_to_rgb( $color_str ) {
5005      _deprecated_function( __FUNCTION__, '6.3.0' );
5006  
5007      $color_str = strtolower( trim( $color_str ) );
5008  
5009      $css_integer = '[-\\+]?\\d+%?';
5010      $css_number  = '[-\\+]?\\d*\\.\\d+%?';
5011  
5012      $css_unit = '(?:' . $css_number . ')|(?:' . $css_integer . ')';
5013  
5014      $permissive_match3 = '[\\s|\\(]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')\\s*\\)?';
5015      $permissive_match4 = '[\\s|\\(]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')[,|\\s]+(' . $css_unit . ')\\s*\\)?';
5016  
5017      $rgb_regexp = '/^rgb' . $permissive_match3 . '$/';
5018      if ( preg_match( $rgb_regexp, $color_str, $match ) ) {
5019          $rgb = wp_tinycolor_rgb_to_rgb(
5020              array(
5021                  'r' => $match[1],
5022                  'g' => $match[2],
5023                  'b' => $match[3],
5024              )
5025          );
5026  
5027          $rgb['a'] = 1;
5028  
5029          return $rgb;
5030      }
5031  
5032      $rgba_regexp = '/^rgba' . $permissive_match4 . '$/';
5033      if ( preg_match( $rgba_regexp, $color_str, $match ) ) {
5034          $rgb = wp_tinycolor_rgb_to_rgb(
5035              array(
5036                  'r' => $match[1],
5037                  'g' => $match[2],
5038                  'b' => $match[3],
5039              )
5040          );
5041  
5042          $rgb['a'] = _wp_tinycolor_bound_alpha( $match[4] );
5043  
5044          return $rgb;
5045      }
5046  
5047      $hsl_regexp = '/^hsl' . $permissive_match3 . '$/';
5048      if ( preg_match( $hsl_regexp, $color_str, $match ) ) {
5049          $rgb = wp_tinycolor_hsl_to_rgb(
5050              array(
5051                  'h' => $match[1],
5052                  's' => $match[2],
5053                  'l' => $match[3],
5054              )
5055          );
5056  
5057          $rgb['a'] = 1;
5058  
5059          return $rgb;
5060      }
5061  
5062      $hsla_regexp = '/^hsla' . $permissive_match4 . '$/';
5063      if ( preg_match( $hsla_regexp, $color_str, $match ) ) {
5064          $rgb = wp_tinycolor_hsl_to_rgb(
5065              array(
5066                  'h' => $match[1],
5067                  's' => $match[2],
5068                  'l' => $match[3],
5069              )
5070          );
5071  
5072          $rgb['a'] = _wp_tinycolor_bound_alpha( $match[4] );
5073  
5074          return $rgb;
5075      }
5076  
5077      $hex8_regexp = '/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/';
5078      if ( preg_match( $hex8_regexp, $color_str, $match ) ) {
5079          $rgb = wp_tinycolor_rgb_to_rgb(
5080              array(
5081                  'r' => base_convert( $match[1], 16, 10 ),
5082                  'g' => base_convert( $match[2], 16, 10 ),
5083                  'b' => base_convert( $match[3], 16, 10 ),
5084              )
5085          );
5086  
5087          $rgb['a'] = _wp_tinycolor_bound_alpha(
5088              base_convert( $match[4], 16, 10 ) / 255
5089          );
5090  
5091          return $rgb;
5092      }
5093  
5094      $hex6_regexp = '/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/';
5095      if ( preg_match( $hex6_regexp, $color_str, $match ) ) {
5096          $rgb = wp_tinycolor_rgb_to_rgb(
5097              array(
5098                  'r' => base_convert( $match[1], 16, 10 ),
5099                  'g' => base_convert( $match[2], 16, 10 ),
5100                  'b' => base_convert( $match[3], 16, 10 ),
5101              )
5102          );
5103  
5104          $rgb['a'] = 1;
5105  
5106          return $rgb;
5107      }
5108  
5109      $hex4_regexp = '/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/';
5110      if ( preg_match( $hex4_regexp, $color_str, $match ) ) {
5111          $rgb = wp_tinycolor_rgb_to_rgb(
5112              array(
5113                  'r' => base_convert( $match[1] . $match[1], 16, 10 ),
5114                  'g' => base_convert( $match[2] . $match[2], 16, 10 ),
5115                  'b' => base_convert( $match[3] . $match[3], 16, 10 ),
5116              )
5117          );
5118  
5119          $rgb['a'] = _wp_tinycolor_bound_alpha(
5120              base_convert( $match[4] . $match[4], 16, 10 ) / 255
5121          );
5122  
5123          return $rgb;
5124      }
5125  
5126      $hex3_regexp = '/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/';
5127      if ( preg_match( $hex3_regexp, $color_str, $match ) ) {
5128          $rgb = wp_tinycolor_rgb_to_rgb(
5129              array(
5130                  'r' => base_convert( $match[1] . $match[1], 16, 10 ),
5131                  'g' => base_convert( $match[2] . $match[2], 16, 10 ),
5132                  'b' => base_convert( $match[3] . $match[3], 16, 10 ),
5133              )
5134          );
5135  
5136          $rgb['a'] = 1;
5137  
5138          return $rgb;
5139      }
5140  
5141      /*
5142       * The JS color picker considers the string "transparent" to be a hex value,
5143       * so we need to handle it here as a special case.
5144       */
5145      if ( 'transparent' === $color_str ) {
5146          return array(
5147              'r' => 0,
5148              'g' => 0,
5149              'b' => 0,
5150              'a' => 0,
5151          );
5152      }
5153  }
5154  
5155  /**
5156   * Returns the prefixed id for the duotone filter for use as a CSS id.
5157   *
5158   * @since 5.9.1
5159   * @deprecated 6.3.0
5160   *
5161   * @access private
5162   *
5163   * @param array $preset Duotone preset value as seen in theme.json.
5164   * @return string Duotone filter CSS id.
5165   */
5166  function wp_get_duotone_filter_id( $preset ) {
5167      _deprecated_function( __FUNCTION__, '6.3.0' );
5168      return WP_Duotone::get_filter_id_from_preset( $preset );
5169  }
5170  
5171  /**
5172   * Returns the CSS filter property url to reference the rendered SVG.
5173   *
5174   * @since 5.9.0
5175   * @since 6.1.0 Allow unset for preset colors.
5176   * @deprecated 6.3.0
5177   *
5178   * @access private
5179   *
5180   * @param array $preset Duotone preset value as seen in theme.json.
5181   * @return string Duotone CSS filter property url value.
5182   */
5183  function wp_get_duotone_filter_property( $preset ) {
5184      _deprecated_function( __FUNCTION__, '6.3.0' );
5185      return WP_Duotone::get_filter_css_property_value_from_preset( $preset );
5186  }
5187  
5188  /**
5189   * Returns the duotone filter SVG string for the preset.
5190   *
5191   * @since 5.9.1
5192   * @deprecated 6.3.0 Use WP_Duotone::get_filter_svg_from_preset() instead.
5193   *
5194   * @access private
5195   *
5196   * @param array $preset Duotone preset value as seen in theme.json.
5197   * @return string Duotone SVG filter.
5198   */
5199  function wp_get_duotone_filter_svg( $preset ) {
5200      _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::get_filter_svg_from_preset()' );
5201      return WP_Duotone::get_filter_svg_from_preset( $preset );
5202  }
5203  
5204  /**
5205   * Registers the style and colors block attributes for block types that support it.
5206   *
5207   * @since 5.8.0
5208   * @deprecated 6.3.0 Use WP_Duotone::register_duotone_support() instead.
5209   *
5210   * @access private
5211   *
5212   * @param WP_Block_Type $block_type Block Type.
5213   */
5214  function wp_register_duotone_support( $block_type ) {
5215      _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::register_duotone_support()' );
5216      return WP_Duotone::register_duotone_support( $block_type );
5217  }
5218  
5219  /**
5220   * Renders out the duotone stylesheet and SVG.
5221   *
5222   * @since 5.8.0
5223   * @since 6.1.0 Allow unset for preset colors.
5224   * @deprecated 6.3.0 Use WP_Duotone::render_duotone_support() instead.
5225   *
5226   * @access private
5227   *
5228   * @param string $block_content Rendered block content.
5229   * @param array  $block         Block object.
5230   * @return string Filtered block content.
5231   */
5232  function wp_render_duotone_support( $block_content, $block ) {
5233      _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Duotone::render_duotone_support()' );
5234      $wp_block = new WP_Block( $block );
5235      return WP_Duotone::render_duotone_support( $block_content, $block, $wp_block );
5236  }
5237  
5238  /**
5239   * Returns a string containing the SVGs to be referenced as filters (duotone).
5240   *
5241   * @since 5.9.1
5242   * @deprecated 6.3.0 SVG generation is handled on a per-block basis in block supports.
5243   *
5244   * @return string
5245   */
5246  function wp_get_global_styles_svg_filters() {
5247      _deprecated_function( __FUNCTION__, '6.3.0' );
5248  
5249      /*
5250       * Ignore cache when the development mode is set to 'theme', so it doesn't interfere with the theme
5251       * developer's workflow.
5252       */
5253      $can_use_cached = ! wp_is_development_mode( 'theme' );
5254      $cache_group    = 'theme_json';
5255      $cache_key      = 'wp_get_global_styles_svg_filters';
5256      if ( $can_use_cached ) {
5257          $cached = wp_cache_get( $cache_key, $cache_group );
5258          if ( $cached ) {
5259              return $cached;
5260          }
5261      }
5262  
5263      $supports_theme_json = wp_theme_has_theme_json();
5264  
5265      $origins = array( 'default', 'theme', 'custom' );
5266      if ( ! $supports_theme_json ) {
5267          $origins = array( 'default' );
5268      }
5269  
5270      $tree = WP_Theme_JSON_Resolver::get_merged_data();
5271      $svgs = $tree->get_svg_filters( $origins );
5272  
5273      if ( $can_use_cached ) {
5274          wp_cache_set( $cache_key, $svgs, $cache_group );
5275      }
5276  
5277      return $svgs;
5278  }
5279  
5280  /**
5281   * Renders the SVG filters supplied by theme.json.
5282   *
5283   * Note that this doesn't render the per-block user-defined
5284   * filters which are handled by wp_render_duotone_support,
5285   * but it should be rendered before the filtered content
5286   * in the body to satisfy Safari's rendering quirks.
5287   *
5288   * @since 5.9.1
5289   * @deprecated 6.3.0 SVG generation is handled on a per-block basis in block supports.
5290   */
5291  function wp_global_styles_render_svg_filters() {
5292      _deprecated_function( __FUNCTION__, '6.3.0' );
5293  
5294      /*
5295       * When calling via the in_admin_header action, we only want to render the
5296       * SVGs on block editor pages.
5297       */
5298      if (
5299          is_admin() &&
5300          ! get_current_screen()->is_block_editor()
5301      ) {
5302          return;
5303      }
5304  
5305      $filters = wp_get_global_styles_svg_filters();
5306      if ( ! empty( $filters ) ) {
5307          echo $filters;
5308      }
5309  }
5310  
5311  /**
5312   * Build an array with CSS classes and inline styles defining the colors
5313   * which will be applied to the navigation markup in the front-end.
5314   *
5315   * @since 5.9.0
5316   * @deprecated 6.3.0 This was removed from the Navigation Submenu block in favour of `wp_apply_colors_support()`.
5317   *                   `wp_apply_colors_support()` returns an array with similar class and style values,
5318   *                   but with different keys: `class` and `style`.
5319   *
5320   * @param  array $context     Navigation block context.
5321   * @param  array $attributes  Block attributes.
5322   * @param  bool  $is_sub_menu Whether the block is a sub-menu.
5323   * @return array Colors CSS classes and inline styles.
5324   */
5325  function block_core_navigation_submenu_build_css_colors( $context, $attributes, $is_sub_menu = false ) {
5326      _deprecated_function( __FUNCTION__, '6.3.0' );
5327      $colors = array(
5328          'css_classes'   => array(),
5329          'inline_styles' => '',
5330      );
5331  
5332      // Text color.
5333      $named_text_color  = null;
5334      $custom_text_color = null;
5335  
5336      if ( $is_sub_menu && array_key_exists( 'customOverlayTextColor', $context ) ) {
5337          $custom_text_color = $context['customOverlayTextColor'];
5338      } elseif ( $is_sub_menu && array_key_exists( 'overlayTextColor', $context ) ) {
5339          $named_text_color = $context['overlayTextColor'];
5340      } elseif ( array_key_exists( 'customTextColor', $context ) ) {
5341          $custom_text_color = $context['customTextColor'];
5342      } elseif ( array_key_exists( 'textColor', $context ) ) {
5343          $named_text_color = $context['textColor'];
5344      } elseif ( isset( $context['style']['color']['text'] ) ) {
5345          $custom_text_color = $context['style']['color']['text'];
5346      }
5347  
5348      // If has text color.
5349      if ( ! is_null( $named_text_color ) ) {
5350          // Add the color class.
5351          array_push( $colors['css_classes'], 'has-text-color', sprintf( 'has-%s-color', $named_text_color ) );
5352      } elseif ( ! is_null( $custom_text_color ) ) {
5353          // Add the custom color inline style.
5354          $colors['css_classes'][]  = 'has-text-color';
5355          $colors['inline_styles'] .= sprintf( 'color: %s;', $custom_text_color );
5356      }
5357  
5358      // Background color.
5359      $named_background_color  = null;
5360      $custom_background_color = null;
5361  
5362      if ( $is_sub_menu && array_key_exists( 'customOverlayBackgroundColor', $context ) ) {
5363          $custom_background_color = $context['customOverlayBackgroundColor'];
5364      } elseif ( $is_sub_menu && array_key_exists( 'overlayBackgroundColor', $context ) ) {
5365          $named_background_color = $context['overlayBackgroundColor'];
5366      } elseif ( array_key_exists( 'customBackgroundColor', $context ) ) {
5367          $custom_background_color = $context['customBackgroundColor'];
5368      } elseif ( array_key_exists( 'backgroundColor', $context ) ) {
5369          $named_background_color = $context['backgroundColor'];
5370      } elseif ( isset( $context['style']['color']['background'] ) ) {
5371          $custom_background_color = $context['style']['color']['background'];
5372      }
5373  
5374      // If has background color.
5375      if ( ! is_null( $named_background_color ) ) {
5376          // Add the background-color class.
5377          array_push( $colors['css_classes'], 'has-background', sprintf( 'has-%s-background-color', $named_background_color ) );
5378      } elseif ( ! is_null( $custom_background_color ) ) {
5379          // Add the custom background-color inline style.
5380          $colors['css_classes'][]  = 'has-background';
5381          $colors['inline_styles'] .= sprintf( 'background-color: %s;', $custom_background_color );
5382      }
5383  
5384      return $colors;
5385  }
5386  
5387  /**
5388   * Runs the theme.json webfonts handler.
5389   *
5390   * Using `WP_Theme_JSON_Resolver`, it gets the fonts defined
5391   * in the `theme.json` for the current selection and style
5392   * variations, validates the font-face properties, generates
5393   * the '@font-face' style declarations, and then enqueues the
5394   * styles for both the editor and front-end.
5395   *
5396   * Design Notes:
5397   * This is not a public API, but rather an internal handler.
5398   * A future public Webfonts API will replace this stopgap code.
5399   *
5400   * This code design is intentional.
5401   *    a. It hides the inner-workings.
5402   *    b. It does not expose API ins or outs for consumption.
5403   *    c. It only works with a theme's `theme.json`.
5404   *
5405   * Why?
5406   *    a. To avoid backwards-compatibility issues when
5407   *       the Webfonts API is introduced in Core.
5408   *    b. To make `fontFace` declarations in `theme.json` work.
5409   *
5410   * @link  https://github.com/WordPress/gutenberg/issues/40472
5411   *
5412   * @since 6.0.0
5413   * @deprecated 6.4.0 Use wp_print_font_faces() instead.
5414   * @access private
5415   */
5416  function _wp_theme_json_webfonts_handler() {
5417      _deprecated_function( __FUNCTION__, '6.4.0', 'wp_print_font_faces' );
5418  
5419      // Block themes are unavailable during installation.
5420      if ( wp_installing() ) {
5421          return;
5422      }
5423  
5424      if ( ! wp_theme_has_theme_json() ) {
5425          return;
5426      }
5427  
5428      // Webfonts to be processed.
5429      $registered_webfonts = array();
5430  
5431      /**
5432       * Gets the webfonts from theme.json.
5433       *
5434       * @since 6.0.0
5435       *
5436       * @return array Array of defined webfonts.
5437       */
5438      $fn_get_webfonts_from_theme_json = static function() {
5439          // Get settings from theme.json.
5440          $settings = WP_Theme_JSON_Resolver::get_merged_data()->get_settings();
5441  
5442          // If in the editor, add webfonts defined in variations.
5443          if ( is_admin() || wp_is_rest_endpoint() ) {
5444              $variations = WP_Theme_JSON_Resolver::get_style_variations();
5445              foreach ( $variations as $variation ) {
5446                  // Skip if fontFamilies are not defined in the variation.
5447                  if ( empty( $variation['settings']['typography']['fontFamilies'] ) ) {
5448                      continue;
5449                  }
5450  
5451                  // Initialize the array structure.
5452                  if ( empty( $settings['typography'] ) ) {
5453                      $settings['typography'] = array();
5454                  }
5455                  if ( empty( $settings['typography']['fontFamilies'] ) ) {
5456                      $settings['typography']['fontFamilies'] = array();
5457                  }
5458                  if ( empty( $settings['typography']['fontFamilies']['theme'] ) ) {
5459                      $settings['typography']['fontFamilies']['theme'] = array();
5460                  }
5461  
5462                  // Combine variations with settings. Remove duplicates.
5463                  $settings['typography']['fontFamilies']['theme'] = array_merge( $settings['typography']['fontFamilies']['theme'], $variation['settings']['typography']['fontFamilies']['theme'] );
5464                  $settings['typography']['fontFamilies']          = array_unique( $settings['typography']['fontFamilies'] );
5465              }
5466          }
5467  
5468          // Bail out early if there are no settings for webfonts.
5469          if ( empty( $settings['typography']['fontFamilies'] ) ) {
5470              return array();
5471          }
5472  
5473          $webfonts = array();
5474  
5475          // Look for fontFamilies.
5476          foreach ( $settings['typography']['fontFamilies'] as $font_families ) {
5477              foreach ( $font_families as $font_family ) {
5478  
5479                  // Skip if fontFace is not defined.
5480                  if ( empty( $font_family['fontFace'] ) ) {
5481                      continue;
5482                  }
5483  
5484                  // Skip if fontFace is not an array of webfonts.
5485                  if ( ! is_array( $font_family['fontFace'] ) ) {
5486                      continue;
5487                  }
5488  
5489                  $webfonts = array_merge( $webfonts, $font_family['fontFace'] );
5490              }
5491          }
5492  
5493          return $webfonts;
5494      };
5495  
5496      /**
5497       * Transforms each 'src' into an URI by replacing 'file:./'
5498       * placeholder from theme.json.
5499       *
5500       * The absolute path to the webfont file(s) cannot be defined in
5501       * theme.json. `file:./` is the placeholder which is replaced by
5502       * the theme's URL path to the theme's root.
5503       *
5504       * @since 6.0.0
5505       *
5506       * @param array $src Webfont file(s) `src`.
5507       * @return array Webfont's `src` in URI.
5508       */
5509      $fn_transform_src_into_uri = static function( array $src ) {
5510          foreach ( $src as $key => $url ) {
5511              // Tweak the URL to be relative to the theme root.
5512              if ( ! str_starts_with( $url, 'file:./' ) ) {
5513                  continue;
5514              }
5515  
5516              $src[ $key ] = get_theme_file_uri( str_replace( 'file:./', '', $url ) );
5517          }
5518  
5519          return $src;
5520      };
5521  
5522      /**
5523       * Converts the font-face properties (i.e. keys) into kebab-case.
5524       *
5525       * @since 6.0.0
5526       *
5527       * @param array $font_face Font face to convert.
5528       * @return array Font faces with each property in kebab-case format.
5529       */
5530      $fn_convert_keys_to_kebab_case = static function( array $font_face ) {
5531          foreach ( $font_face as $property => $value ) {
5532              $kebab_case               = _wp_to_kebab_case( $property );
5533              $font_face[ $kebab_case ] = $value;
5534              if ( $kebab_case !== $property ) {
5535                  unset( $font_face[ $property ] );
5536              }
5537          }
5538  
5539          return $font_face;
5540      };
5541  
5542      /**
5543       * Validates a webfont.
5544       *
5545       * @since 6.0.0
5546       *
5547       * @param array $webfont The webfont arguments.
5548       * @return array|false The validated webfont arguments, or false if the webfont is invalid.
5549       */
5550      $fn_validate_webfont = static function( $webfont ) {
5551          $webfont = wp_parse_args(
5552                  $webfont,
5553                  array(
5554                          'font-family'  => '',
5555                          'font-style'   => 'normal',
5556                          'font-weight'  => '400',
5557                          'font-display' => 'fallback',
5558                          'src'          => array(),
5559                  )
5560          );
5561  
5562          // Check the font-family.
5563          if ( empty( $webfont['font-family'] ) || ! is_string( $webfont['font-family'] ) ) {
5564              trigger_error( __( 'Webfont font family must be a non-empty string.' ) );
5565  
5566              return false;
5567          }
5568  
5569          // Check that the `src` property is defined and a valid type.
5570          if ( empty( $webfont['src'] ) || ( ! is_string( $webfont['src'] ) && ! is_array( $webfont['src'] ) ) ) {
5571              trigger_error( __( 'Webfont src must be a non-empty string or an array of strings.' ) );
5572  
5573              return false;
5574          }
5575  
5576          // Validate the `src` property.
5577          foreach ( (array) $webfont['src'] as $src ) {
5578              if ( ! is_string( $src ) || '' === trim( $src ) ) {
5579                  trigger_error( __( 'Each webfont src must be a non-empty string.' ) );
5580  
5581                  return false;
5582              }
5583          }
5584  
5585          // Check the font-weight.
5586          if ( ! is_string( $webfont['font-weight'] ) && ! is_int( $webfont['font-weight'] ) ) {
5587              trigger_error( __( 'Webfont font weight must be a properly formatted string or integer.' ) );
5588  
5589              return false;
5590          }
5591  
5592          // Check the font-display.
5593          if ( ! in_array( $webfont['font-display'], array( 'auto', 'block', 'fallback', 'optional', 'swap' ), true ) ) {
5594              $webfont['font-display'] = 'fallback';
5595          }
5596  
5597          $valid_props = array(
5598                  'ascend-override',
5599                  'descend-override',
5600                  'font-display',
5601                  'font-family',
5602                  'font-stretch',
5603                  'font-style',
5604                  'font-weight',
5605                  'font-variant',
5606                  'font-feature-settings',
5607                  'font-variation-settings',
5608                  'line-gap-override',
5609                  'size-adjust',
5610                  'src',
5611                  'unicode-range',
5612          );
5613  
5614          foreach ( $webfont as $prop => $value ) {
5615              if ( ! in_array( $prop, $valid_props, true ) ) {
5616                  unset( $webfont[ $prop ] );
5617              }
5618          }
5619  
5620          return $webfont;
5621      };
5622  
5623      /**
5624       * Registers webfonts declared in theme.json.
5625       *
5626       * @since 6.0.0
5627       *
5628       * @uses $registered_webfonts To access and update the registered webfonts registry (passed by reference).
5629       * @uses $fn_get_webfonts_from_theme_json To run the function that gets the webfonts from theme.json.
5630       * @uses $fn_convert_keys_to_kebab_case To run the function that converts keys into kebab-case.
5631       * @uses $fn_validate_webfont To run the function that validates each font-face (webfont) from theme.json.
5632       */
5633      $fn_register_webfonts = static function() use ( &$registered_webfonts, $fn_get_webfonts_from_theme_json, $fn_convert_keys_to_kebab_case, $fn_validate_webfont, $fn_transform_src_into_uri ) {
5634          $registered_webfonts = array();
5635  
5636          foreach ( $fn_get_webfonts_from_theme_json() as $webfont ) {
5637              if ( ! is_array( $webfont ) ) {
5638                  continue;
5639              }
5640  
5641              $webfont = $fn_convert_keys_to_kebab_case( $webfont );
5642  
5643              $webfont = $fn_validate_webfont( $webfont );
5644  
5645              $webfont['src'] = $fn_transform_src_into_uri( (array) $webfont['src'] );
5646  
5647              // Skip if not valid.
5648              if ( empty( $webfont ) ) {
5649                  continue;
5650              }
5651  
5652              $registered_webfonts[] = $webfont;
5653          }
5654      };
5655  
5656      /**
5657       * Orders 'src' items to optimize for browser support.
5658       *
5659       * @since 6.0.0
5660       *
5661       * @param array $webfont Webfont to process.
5662       * @return array Ordered `src` items.
5663       */
5664      $fn_order_src = static function( array $webfont ) {
5665          $src         = array();
5666          $src_ordered = array();
5667  
5668          foreach ( $webfont['src'] as $url ) {
5669              // Add data URIs first.
5670              if ( str_starts_with( trim( $url ), 'data:' ) ) {
5671                  $src_ordered[] = array(
5672                          'url'    => $url,
5673                          'format' => 'data',
5674                  );
5675                  continue;
5676              }
5677              $format         = pathinfo( $url, PATHINFO_EXTENSION );
5678              $src[ $format ] = $url;
5679          }
5680  
5681          // Add woff2.
5682          if ( ! empty( $src['woff2'] ) ) {
5683              $src_ordered[] = array(
5684                      'url'    => sanitize_url( $src['woff2'] ),
5685                      'format' => 'woff2',
5686              );
5687          }
5688  
5689          // Add woff.
5690          if ( ! empty( $src['woff'] ) ) {
5691              $src_ordered[] = array(
5692                      'url'    => sanitize_url( $src['woff'] ),
5693                      'format' => 'woff',
5694              );
5695          }
5696  
5697          // Add ttf.
5698          if ( ! empty( $src['ttf'] ) ) {
5699              $src_ordered[] = array(
5700                      'url'    => sanitize_url( $src['ttf'] ),
5701                      'format' => 'truetype',
5702              );
5703          }
5704  
5705          // Add eot.
5706          if ( ! empty( $src['eot'] ) ) {
5707              $src_ordered[] = array(
5708                      'url'    => sanitize_url( $src['eot'] ),
5709                      'format' => 'embedded-opentype',
5710              );
5711          }
5712  
5713          // Add otf.
5714          if ( ! empty( $src['otf'] ) ) {
5715              $src_ordered[] = array(
5716                      'url'    => sanitize_url( $src['otf'] ),
5717                      'format' => 'opentype',
5718              );
5719          }
5720          $webfont['src'] = $src_ordered;
5721  
5722          return $webfont;
5723      };
5724  
5725      /**
5726       * Compiles the 'src' into valid CSS.
5727       *
5728       * @since 6.0.0
5729       * @since 6.2.0 Removed local() CSS.
5730       *
5731       * @param string $font_family Font family.
5732       * @param array  $value       Value to process.
5733       * @return string The CSS.
5734       */
5735      $fn_compile_src = static function( $font_family, array $value ) {
5736          $src = '';
5737  
5738          foreach ( $value as $item ) {
5739              $src .= ( 'data' === $item['format'] )
5740                      ? ", url({$item['url']})"
5741                      : ", url('{$item['url']}') format('{$item['format']}')";
5742          }
5743  
5744          $src = ltrim( $src, ', ' );
5745  
5746          return $src;
5747      };
5748  
5749      /**
5750       * Compiles the font variation settings.
5751       *
5752       * @since 6.0.0
5753       *
5754       * @param array $font_variation_settings Array of font variation settings.
5755       * @return string The CSS.
5756       */
5757      $fn_compile_variations = static function( array $font_variation_settings ) {
5758          $variations = '';
5759  
5760          foreach ( $font_variation_settings as $key => $value ) {
5761              $variations .= "$key $value";
5762          }
5763  
5764          return $variations;
5765      };
5766  
5767      /**
5768       * Builds the font-family's CSS.
5769       *
5770       * @since 6.0.0
5771       *
5772       * @uses $fn_compile_src To run the function that compiles the src.
5773       * @uses $fn_compile_variations To run the function that compiles the variations.
5774       *
5775       * @param array $webfont Webfont to process.
5776       * @return string This font-family's CSS.
5777       */
5778      $fn_build_font_face_css = static function( array $webfont ) use ( $fn_compile_src, $fn_compile_variations ) {
5779          $css = '';
5780  
5781          // Wrap font-family in quotes if it contains spaces.
5782          if (
5783                  str_contains( $webfont['font-family'], ' ' ) &&
5784                  ! str_contains( $webfont['font-family'], '"' ) &&
5785                  ! str_contains( $webfont['font-family'], "'" )
5786          ) {
5787              $webfont['font-family'] = '"' . $webfont['font-family'] . '"';
5788          }
5789  
5790          foreach ( $webfont as $key => $value ) {
5791              /*
5792               * Skip "provider", since it's for internal API use,
5793               * and not a valid CSS property.
5794               */
5795              if ( 'provider' === $key ) {
5796                  continue;
5797              }
5798  
5799              // Compile the "src" parameter.
5800              if ( 'src' === $key ) {
5801                  $value = $fn_compile_src( $webfont['font-family'], $value );
5802              }
5803  
5804              // If font-variation-settings is an array, convert it to a string.
5805              if ( 'font-variation-settings' === $key && is_array( $value ) ) {
5806                  $value = $fn_compile_variations( $value );
5807              }
5808  
5809              if ( ! empty( $value ) ) {
5810                  $css .= "$key:$value;";
5811              }
5812          }
5813  
5814          return $css;
5815      };
5816  
5817      /**
5818       * Gets the '@font-face' CSS styles for locally-hosted font files.
5819       *
5820       * @since 6.0.0
5821       *
5822       * @uses $registered_webfonts To access and update the registered webfonts registry (passed by reference).
5823       * @uses $fn_order_src To run the function that orders the src.
5824       * @uses $fn_build_font_face_css To run the function that builds the font-face CSS.
5825       *
5826       * @return string The `@font-face` CSS.
5827       */
5828      $fn_get_css = static function() use ( &$registered_webfonts, $fn_order_src, $fn_build_font_face_css ) {
5829          $css = '';
5830  
5831          foreach ( $registered_webfonts as $webfont ) {
5832              // Order the webfont's `src` items to optimize for browser support.
5833              $webfont = $fn_order_src( $webfont );
5834  
5835              // Build the @font-face CSS for this webfont.
5836              $css .= '@font-face{' . $fn_build_font_face_css( $webfont ) . '}';
5837          }
5838  
5839          return $css;
5840      };
5841  
5842      /**
5843       * Generates and enqueues webfonts styles.
5844       *
5845       * @since 6.0.0
5846       *
5847       * @uses $fn_get_css To run the function that gets the CSS.
5848       */
5849      $fn_generate_and_enqueue_styles = static function() use ( $fn_get_css ) {
5850          // Generate the styles.
5851          $styles = $fn_get_css();
5852  
5853          // Bail out if there are no styles to enqueue.
5854          if ( '' === $styles ) {
5855              return;
5856          }
5857  
5858          // Enqueue the stylesheet.
5859          wp_register_style( 'wp-webfonts', '' );
5860          wp_enqueue_style( 'wp-webfonts' );
5861  
5862          // Add the styles to the stylesheet.
5863          wp_add_inline_style( 'wp-webfonts', $styles );
5864      };
5865  
5866      /**
5867       * Generates and enqueues editor styles.
5868       *
5869       * @since 6.0.0
5870       *
5871       * @uses $fn_get_css To run the function that gets the CSS.
5872       */
5873      $fn_generate_and_enqueue_editor_styles = static function() use ( $fn_get_css ) {
5874          // Generate the styles.
5875          $styles = $fn_get_css();
5876  
5877          // Bail out if there are no styles to enqueue.
5878          if ( '' === $styles ) {
5879              return;
5880          }
5881  
5882          wp_add_inline_style( 'wp-block-library', $styles );
5883      };
5884  
5885      add_action( 'wp_loaded', $fn_register_webfonts );
5886      add_action( 'wp_enqueue_scripts', $fn_generate_and_enqueue_styles );
5887      add_action( 'admin_init', $fn_generate_and_enqueue_editor_styles );
5888  }
5889  
5890  /**
5891   * Prints the CSS in the embed iframe header.
5892   *
5893   * @since 4.4.0
5894   * @deprecated 6.4.0 Use wp_enqueue_embed_styles() instead.
5895   */
5896  function print_embed_styles() {
5897      _deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_embed_styles' );
5898  
5899      $suffix = SCRIPT_DEBUG ? '' : '.min';
5900      ?>
5901      <style>
5902          <?php echo file_get_contents( ABSPATH . WPINC . "/css/wp-embed-template$suffix.css" ); ?>
5903      </style>
5904      <?php
5905  }
5906  
5907  /**
5908   * Prints the important emoji-related styles.
5909   *
5910   * @since 4.2.0
5911   * @deprecated 6.4.0 Use wp_enqueue_emoji_styles() instead.
5912   */
5913  function print_emoji_styles() {
5914      _deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_emoji_styles' );
5915      static $printed = false;
5916  
5917      if ( $printed ) {
5918          return;
5919      }
5920  
5921      $printed = true;
5922  
5923      ?>
5924      <style>
5925      img.wp-smiley,
5926      img.emoji {
5927          display: inline !important;
5928          border: none !important;
5929          box-shadow: none !important;
5930          height: 1em !important;
5931          width: 1em !important;
5932          margin: 0 0.07em !important;
5933          vertical-align: -0.1em !important;
5934          background: none !important;
5935          padding: 0 !important;
5936      }
5937      </style>
5938      <?php
5939  }
5940  
5941  /**
5942   * Prints style and scripts for the admin bar.
5943   *
5944   * @since 3.1.0
5945   * @deprecated 6.4.0 Use wp_enqueue_admin_bar_header_styles() instead.
5946   */
5947  function wp_admin_bar_header() {
5948      _deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_admin_bar_header_styles' );
5949      ?>
5950      <style media="print">#wpadminbar { display:none; }</style>
5951      <?php
5952  }
5953  
5954  /**
5955   * Prints default admin bar callback.
5956   *
5957   * @since 3.1.0
5958   * @deprecated 6.4.0 Use wp_enqueue_admin_bar_bump_styles() instead.
5959   */
5960  function _admin_bar_bump_cb() {
5961      _deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_admin_bar_bump_styles' );
5962      ?>
5963      <style media="screen">
5964      html { margin-top: 32px !important; }
5965      @media screen and ( max-width: 782px ) {
5966        html { margin-top: 46px !important; }
5967      }
5968      </style>
5969      <?php
5970  }
5971  
5972  /**
5973   * Runs a remote HTTPS request to detect whether HTTPS supported, and stores potential errors.
5974   *
5975   * This internal function is called by a regular Cron hook to ensure HTTPS support is detected and maintained.
5976   *
5977   * @since 5.7.0
5978   * @deprecated 6.4.0 The `wp_update_https_detection_errors()` function is no longer used and has been replaced by
5979   *                   `wp_get_https_detection_errors()`. Previously the function was called by a regular Cron hook to
5980   *                    update the `https_detection_errors` option, but this is no longer necessary as the errors are
5981   *                    retrieved directly in Site Health and no longer used outside of Site Health.
5982   * @access private
5983   */
5984  function wp_update_https_detection_errors() {
5985      _deprecated_function( __FUNCTION__, '6.4.0' );
5986  
5987      /**
5988       * Short-circuits the process of detecting errors related to HTTPS support.
5989       *
5990       * Returning a `WP_Error` from the filter will effectively short-circuit the default logic of trying a remote
5991       * request to the site over HTTPS, storing the errors array from the returned `WP_Error` instead.
5992       *
5993       * @since 5.7.0
5994       * @deprecated 6.4.0 The `wp_update_https_detection_errors` filter is no longer used and has been replaced by `pre_wp_get_https_detection_errors`.
5995       *
5996       * @param null|WP_Error $pre Error object to short-circuit detection,
5997       *                           or null to continue with the default behavior.
5998       */
5999      $support_errors = apply_filters( 'pre_wp_update_https_detection_errors', null );
6000      if ( is_wp_error( $support_errors ) ) {
6001          update_option( 'https_detection_errors', $support_errors->errors, false );
6002          return;
6003      }
6004  
6005      $support_errors = wp_get_https_detection_errors();
6006  
6007      update_option( 'https_detection_errors', $support_errors );
6008  }
6009  
6010  /**
6011   * Adds `decoding` attribute to an `img` HTML tag.
6012   *
6013   * The `decoding` attribute allows developers to indicate whether the
6014   * browser can decode the image off the main thread (`async`), on the
6015   * main thread (`sync`) or as determined by the browser (`auto`).
6016   *
6017   * By default WordPress adds `decoding="async"` to images but developers
6018   * can use the {@see 'wp_img_tag_add_decoding_attr'} filter to modify this
6019   * to remove the attribute or set it to another accepted value.
6020   *
6021   * @since 6.1.0
6022   * @deprecated 6.4.0 Use wp_img_tag_add_loading_optimization_attrs() instead.
6023   * @see wp_img_tag_add_loading_optimization_attrs()
6024   *
6025   * @param string $image   The HTML `img` tag where the attribute should be added.
6026   * @param string $context Additional context to pass to the filters.
6027   * @return string Converted `img` tag with `decoding` attribute added.
6028   */
6029  function wp_img_tag_add_decoding_attr( $image, $context ) {
6030      _deprecated_function( __FUNCTION__, '6.4.0', 'wp_img_tag_add_loading_optimization_attrs()' );
6031  
6032      /*
6033       * Only apply the decoding attribute to images that have a src attribute that
6034       * starts with a double quote, ensuring escaped JSON is also excluded.
6035       */
6036      if ( ! str_contains( $image, ' src="' ) ) {
6037          return $image;
6038      }
6039  
6040      /** This action is documented in wp-includes/media.php */
6041      $value = apply_filters( 'wp_img_tag_add_decoding_attr', 'async', $image, $context );
6042  
6043      if ( in_array( $value, array( 'async', 'sync', 'auto' ), true ) ) {
6044          $image = str_replace( '<img ', '<img decoding="' . esc_attr( $value ) . '" ', $image );
6045      }
6046  
6047      return $image;
6048  }
6049  
6050  /**
6051   * Parses wp_template content and injects the active theme's
6052   * stylesheet as a theme attribute into each wp_template_part
6053   *
6054   * @since 5.9.0
6055   * @deprecated 6.4.0 Use traverse_and_serialize_blocks( parse_blocks( $template_content ), '_inject_theme_attribute_in_template_part_block' ) instead.
6056   * @access private
6057   *
6058   * @param string $template_content serialized wp_template content.
6059   * @return string Updated 'wp_template' content.
6060   */
6061  function _inject_theme_attribute_in_block_template_content( $template_content ) {
6062      _deprecated_function(
6063          __FUNCTION__,
6064          '6.4.0',
6065          'traverse_and_serialize_blocks( parse_blocks( $template_content ), "_inject_theme_attribute_in_template_part_block" )'
6066      );
6067  
6068      $has_updated_content = false;
6069      $new_content         = '';
6070      $template_blocks     = parse_blocks( $template_content );
6071  
6072      $blocks = _flatten_blocks( $template_blocks );
6073      foreach ( $blocks as &$block ) {
6074          if (
6075              'core/template-part' === $block['blockName'] &&
6076              ! isset( $block['attrs']['theme'] )
6077          ) {
6078              $block['attrs']['theme'] = get_stylesheet();
6079              $has_updated_content     = true;
6080          }
6081      }
6082  
6083      if ( $has_updated_content ) {
6084          foreach ( $template_blocks as &$block ) {
6085              $new_content .= serialize_block( $block );
6086          }
6087  
6088          return $new_content;
6089      }
6090  
6091      return $template_content;
6092  }
6093  
6094  /**
6095   * Parses a block template and removes the theme attribute from each template part.
6096   *
6097   * @since 5.9.0
6098   * @deprecated 6.4.0 Use traverse_and_serialize_blocks( parse_blocks( $template_content ), '_remove_theme_attribute_from_template_part_block' ) instead.
6099   * @access private
6100   *
6101   * @param string $template_content Serialized block template content.
6102   * @return string Updated block template content.
6103   */
6104  function _remove_theme_attribute_in_block_template_content( $template_content ) {
6105      _deprecated_function(
6106          __FUNCTION__,
6107          '6.4.0',
6108          'traverse_and_serialize_blocks( parse_blocks( $template_content ), "_remove_theme_attribute_from_template_part_block" )'
6109      );
6110  
6111      $has_updated_content = false;
6112      $new_content         = '';
6113      $template_blocks     = parse_blocks( $template_content );
6114  
6115      $blocks = _flatten_blocks( $template_blocks );
6116      foreach ( $blocks as $key => $block ) {
6117          if ( 'core/template-part' === $block['blockName'] && isset( $block['attrs']['theme'] ) ) {
6118              unset( $blocks[ $key ]['attrs']['theme'] );
6119              $has_updated_content = true;
6120          }
6121      }
6122  
6123      if ( ! $has_updated_content ) {
6124          return $template_content;
6125      }
6126  
6127      foreach ( $template_blocks as $block ) {
6128          $new_content .= serialize_block( $block );
6129      }
6130  
6131      return $new_content;
6132  }
6133  
6134  /**
6135   * Prints the skip-link script & styles.
6136   *
6137   * @since 5.8.0
6138   * @access private
6139   * @deprecated 6.4.0 Use wp_enqueue_block_template_skip_link() instead.
6140   *
6141   * @global string $_wp_current_template_content
6142   */
6143  function the_block_template_skip_link() {
6144      _deprecated_function( __FUNCTION__, '6.4.0', 'wp_enqueue_block_template_skip_link()' );
6145  
6146      global $_wp_current_template_content;
6147  
6148      // Early exit if not a block theme.
6149      if ( ! current_theme_supports( 'block-templates' ) ) {
6150          return;
6151      }
6152  
6153      // Early exit if not a block template.
6154      if ( ! $_wp_current_template_content ) {
6155          return;
6156      }
6157      ?>
6158  
6159      <?php
6160      /**
6161       * Print the skip-link styles.
6162       */
6163      ?>
6164      <style id="skip-link-styles">
6165          .skip-link.screen-reader-text {
6166              border: 0;
6167              clip-path: inset(50%);
6168              height: 1px;
6169              margin: -1px;
6170              overflow: hidden;
6171              padding: 0;
6172              position: absolute !important;
6173              width: 1px;
6174              /* Many screen reader and browser combinations announce broken words as they would appear visually. */
6175              word-wrap: normal !important;
6176              word-break: normal !important;
6177          }
6178  
6179          .skip-link.screen-reader-text:focus {
6180              background-color: #eee;
6181              clip-path: none;
6182              color: #444;
6183              display: block;
6184              font-size: 1em;
6185              height: auto;
6186              left: 5px;
6187              line-height: normal;
6188              padding: 15px 23px 14px;
6189              text-decoration: none;
6190              top: 5px;
6191              width: auto;
6192              z-index: 100000;
6193          }
6194      </style>
6195      <?php
6196      /**
6197       * Print the skip-link script.
6198       */
6199      ?>
6200      <script>
6201      ( function() {
6202          var skipLinkTarget = document.querySelector( 'main' ),
6203              sibling,
6204              skipLinkTargetID,
6205              skipLink;
6206  
6207          // Early exit if a skip-link target can't be located.
6208          if ( ! skipLinkTarget ) {
6209              return;
6210          }
6211  
6212          /*
6213           * Get the site wrapper.
6214           * The skip-link will be injected in the beginning of it.
6215           */
6216          sibling = document.querySelector( '.wp-site-blocks' );
6217  
6218          // Early exit if the root element was not found.
6219          if ( ! sibling ) {
6220              return;
6221          }
6222  
6223          // Get the skip-link target's ID, and generate one if it doesn't exist.
6224          skipLinkTargetID = skipLinkTarget.id;
6225          if ( ! skipLinkTargetID ) {
6226              skipLinkTargetID = 'wp--skip-link--target';
6227              skipLinkTarget.id = skipLinkTargetID;
6228          }
6229  
6230          // Create the skip link.
6231          skipLink = document.createElement( 'a' );
6232          skipLink.classList.add( 'skip-link', 'screen-reader-text' );
6233          skipLink.href = '#' + skipLinkTargetID;
6234          skipLink.innerHTML = '<?php /* translators: Hidden accessibility text. */ esc_html_e( 'Skip to content' ); ?>';
6235  
6236          // Inject the skip link.
6237          sibling.parentElement.insertBefore( skipLink, sibling );
6238      }() );
6239      </script>
6240      <?php
6241  }
6242  
6243  /**
6244   * Ensure that the view script has the `wp-interactivity` dependency.
6245   *
6246   * @since 6.4.0
6247   * @deprecated 6.5.0
6248   */
6249  function block_core_query_ensure_interactivity_dependency() {
6250      _deprecated_function( __FUNCTION__, '6.5.0', 'wp_register_script_module' );
6251  }
6252  
6253  /**
6254   * Ensure that the view script has the `wp-interactivity` dependency.
6255   *
6256   * @since 6.4.0
6257   * @deprecated 6.5.0
6258   */
6259  function block_core_file_ensure_interactivity_dependency() {
6260      _deprecated_function( __FUNCTION__, '6.5.0', 'wp_register_script_module' );
6261  }
6262  
6263  /**
6264   * Ensures that the view script has the `wp-interactivity` dependency.
6265   *
6266   * @since 6.4.0
6267   * @deprecated 6.5.0
6268   */
6269  function block_core_image_ensure_interactivity_dependency() {
6270      _deprecated_function( __FUNCTION__, '6.5.0', 'wp_register_script_module' );
6271  }
6272  
6273  /**
6274   * Updates the block content with elements class names.
6275   *
6276   * @deprecated 6.6.0 Generation of element class name is handled via `render_block_data` filter.
6277   *
6278   * @since 5.8.0
6279   * @since 6.4.0 Added support for button and heading element styling.
6280   * @access private
6281   *
6282   * @param string $block_content Rendered block content.
6283   * @param array  $block         Block object.
6284   * @return string Filtered block content.
6285   */
6286  function wp_render_elements_support( $block_content, $block ) {
6287      _deprecated_function( __FUNCTION__, '6.6.0', 'wp_render_elements_class_name' );
6288      return $block_content;
6289  }
6290  
6291  /**
6292   * Processes the directives on the rendered HTML of the interactive blocks.
6293   *
6294   * This processes only one root interactive block at a time because the
6295   * rendered HTML of that block contains the rendered HTML of all its inner
6296   * blocks, including any interactive block. It does so by ignoring all the
6297   * interactive inner blocks until the root interactive block is processed.
6298   *
6299   * @since 6.5.0
6300   * @deprecated 6.6.0
6301   *
6302   * @param array $parsed_block The parsed block.
6303   * @return array The same parsed block.
6304   */
6305  function wp_interactivity_process_directives_of_interactive_blocks( array $parsed_block ): array {
6306      _deprecated_function( __FUNCTION__, '6.6.0' );
6307      return $parsed_block;
6308  }
6309  
6310  /**
6311   * Gets the global styles custom CSS from theme.json.
6312   *
6313   * @since 6.2.0
6314   * @deprecated 6.7.0 Use {@see 'wp_get_global_stylesheet'} instead for top-level custom CSS, or {@see 'WP_Theme_JSON::get_styles_for_block'} for block-level custom CSS.
6315   *
6316   * @return string The global styles custom CSS.
6317   */
6318  function wp_get_global_styles_custom_css() {
6319      _deprecated_function( __FUNCTION__, '6.7.0', 'wp_get_global_stylesheet' );
6320      if ( ! wp_theme_has_theme_json() ) {
6321          return '';
6322      }
6323      /*
6324       * Ignore cache when the development mode is set to 'theme', so it doesn't interfere with the theme
6325       * developer's workflow.
6326       */
6327      $can_use_cached = ! wp_is_development_mode( 'theme' );
6328  
6329      /*
6330       * By using the 'theme_json' group, this data is marked to be non-persistent across requests.
6331       * @see `wp_cache_add_non_persistent_groups()`.
6332       *
6333       * The rationale for this is to make sure derived data from theme.json
6334       * is always fresh from the potential modifications done via hooks
6335       * that can use dynamic data (modify the stylesheet depending on some option,
6336       * settings depending on user permissions, etc.).
6337       * See some of the existing hooks to modify theme.json behavior:
6338       * @see https://make.wordpress.org/core/2022/10/10/filters-for-theme-json-data/
6339       *
6340       * A different alternative considered was to invalidate the cache upon certain
6341       * events such as options add/update/delete, user meta, etc.
6342       * It was judged not enough, hence this approach.
6343       * @see https://github.com/WordPress/gutenberg/pull/45372
6344       */
6345      $cache_key   = 'wp_get_global_styles_custom_css';
6346      $cache_group = 'theme_json';
6347      if ( $can_use_cached ) {
6348          $cached = wp_cache_get( $cache_key, $cache_group );
6349          if ( $cached ) {
6350              return $cached;
6351          }
6352      }
6353  
6354      $tree       = WP_Theme_JSON_Resolver::get_merged_data();
6355      $stylesheet = $tree->get_custom_css();
6356  
6357      if ( $can_use_cached ) {
6358          wp_cache_set( $cache_key, $stylesheet, $cache_group );
6359      }
6360  
6361      return $stylesheet;
6362  }
6363  
6364  /**
6365   * Enqueues the global styles custom css defined via theme.json.
6366   *
6367   * @since 6.2.0
6368   * @deprecated 6.7.0 Use {@see 'wp_enqueue_global_styles'} instead.
6369   */
6370  function wp_enqueue_global_styles_custom_css() {
6371      _deprecated_function( __FUNCTION__, '6.7.0', 'wp_enqueue_global_styles' );
6372      if ( ! wp_is_block_theme() ) {
6373          return;
6374      }
6375  
6376      // Don't enqueue Customizer's custom CSS separately.
6377      remove_action( 'wp_head', 'wp_custom_css_cb', 101 );
6378  
6379      $custom_css  = wp_get_custom_css();
6380      $custom_css .= wp_get_global_styles_custom_css();
6381  
6382      if ( ! empty( $custom_css ) ) {
6383          wp_add_inline_style( 'global-styles', $custom_css );
6384      }
6385  }
6386  
6387  /**
6388   * Generate block style variation instance name.
6389   *
6390   * @since 6.6.0
6391   * @deprecated 6.7.0 Use `wp_unique_id( $variation . '--' )` instead.
6392   *
6393   * @access private
6394   *
6395   * @param array  $block     Block object.
6396   * @param string $variation Slug for the block style variation.
6397   *
6398   * @return string The unique variation name.
6399   */
6400  function wp_create_block_style_variation_instance_name( $block, $variation ) {
6401      _deprecated_function( __FUNCTION__, '6.7.0', 'wp_unique_id' );
6402      return $variation . '--' . md5( serialize( $block ) );
6403  }
6404  
6405  /**
6406   * Returns whether the current user has the specified capability for a given site.
6407   *
6408   * @since 3.0.0
6409   * @since 5.3.0 Formalized the existing and already documented `...$args` parameter
6410   *              by adding it to the function signature.
6411   * @since 5.8.0 Wraps current_user_can() after switching to blog.
6412   * @deprecated 6.7.0 Use current_user_can_for_site() instead.
6413   *
6414   * @param int    $blog_id    Site ID.
6415   * @param string $capability Capability name.
6416   * @param mixed  ...$args    Optional further parameters, typically starting with an object ID.
6417   * @return bool Whether the user has the given capability.
6418   */
6419  function current_user_can_for_blog( $blog_id, $capability, ...$args ) {
6420      return current_user_can_for_site( $blog_id, $capability, ...$args );
6421  }
6422  
6423  /**
6424   * Loads classic theme styles on classic themes in the editor.
6425   *
6426   * This is used for backwards compatibility for Button and File blocks specifically.
6427   *
6428   * @since 6.1.0
6429   * @since 6.2.0 Added File block styles.
6430   * @deprecated 6.8.0 Styles are enqueued, not printed in the body element.
6431   *
6432   * @param array $editor_settings The array of editor settings.
6433   * @return array A filtered array of editor settings.
6434   */
6435  function wp_add_editor_classic_theme_styles( $editor_settings ) {
6436      _deprecated_function( __FUNCTION__, '6.8.0', 'wp_enqueue_classic_theme_styles' );
6437  
6438      if ( wp_theme_has_theme_json() ) {
6439          return $editor_settings;
6440      }
6441  
6442      $suffix               = wp_scripts_get_suffix();
6443      $classic_theme_styles = ABSPATH . WPINC . "/css/classic-themes$suffix.css";
6444  
6445      /*
6446       * This follows the pattern of get_block_editor_theme_styles,
6447       * but we can't use get_block_editor_theme_styles directly as it
6448       * only handles external files or theme files.
6449       */
6450      $classic_theme_styles_settings = array(
6451          'css'            => file_get_contents( $classic_theme_styles ),
6452          '__unstableType' => 'core',
6453          'isGlobalStyles' => false,
6454      );
6455  
6456      // Add these settings to the start of the array so that themes can override them.
6457      array_unshift( $editor_settings['styles'], $classic_theme_styles_settings );
6458  
6459      return $editor_settings;
6460  }
6461  
6462  /**
6463   * Prints a CSS rule to fix potential visual issues with images using `sizes=auto`.
6464   *
6465   * This rule overrides the similar rule in the default user agent stylesheet, to avoid images that use e.g.
6466   * `width: auto` or `width: fit-content` to appear smaller.
6467   *
6468   * @since 6.7.1
6469   * @deprecated 6.9.0 Use wp_enqueue_img_auto_sizes_contain_css_fix() instead.
6470   * @see wp_enqueue_img_auto_sizes_contain_css_fix()
6471   *
6472   * @see https://html.spec.whatwg.org/multipage/rendering.html#img-contain-size
6473   * @see https://core.trac.wordpress.org/ticket/62413
6474   * @see https://core.trac.wordpress.org/ticket/62731
6475   */
6476  function wp_print_auto_sizes_contain_css_fix() {
6477      _deprecated_function( __FUNCTION__, '6.9.0', 'wp_enqueue_img_auto_sizes_contain_css_fix' );
6478  
6479      /** This filter is documented in wp-includes/media.php */
6480      $add_auto_sizes = apply_filters( 'wp_img_tag_add_auto_sizes', true );
6481      if ( ! $add_auto_sizes ) {
6482          return;
6483      }
6484  
6485      ?>
6486      <style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
6487      <?php
6488  }
6489  
6490  /**
6491   * Adds slashes to a string or recursively adds slashes to strings within an array.
6492   *
6493   * This function is just a wrapper for `wp_slash()`. It was originally related to
6494   * magic quotes functionality which was deprecated in PHP 5.3.0 and removed in PHP 5.4.0.
6495   *
6496   * @since 0.71
6497   * @deprecated 7.0.0 Use wp_slash() instead.
6498   * @see wp_slash()
6499   *
6500   * @param string|array $gpc String or array of data to slash.
6501   * @return string|array Slashed `$gpc`.
6502   */
6503  function addslashes_gpc( $gpc ) {
6504      _deprecated_function( __FUNCTION__, '7.0.0', 'wp_slash()' );
6505      return wp_slash( $gpc );
6506  }
6507  
6508  /**
6509   * Sanitizes an attributes array into an attributes string to be placed inside a `<script>` tag.
6510   *
6511   * This function is deprecated, use {@see wp_get_script_tag()} or {@see wp_get_inline_script_tag()} instead.
6512   *
6513   * @since 5.7.0
6514   * @deprecated 7.0.0 Use wp_get_script_tag() or wp_get_inline_script_tag().
6515   * @see wp_get_script_tag()
6516   * @see wp_get_inline_script_tag()
6517   *
6518   * @param array<string, string|bool> $attributes Key-value pairs representing `<script>` tag attributes.
6519   * @return string String made of sanitized `<script>` tag attributes.
6520   */
6521  function wp_sanitize_script_attributes( $attributes ) {
6522      _deprecated_function( __FUNCTION__, '7.0.0', 'wp_get_script_tag() or wp_get_inline_script_tag()' );
6523  
6524      $attributes_string = '';
6525      foreach ( $attributes as $attribute_name => $attribute_value ) {
6526          if ( is_bool( $attribute_value ) ) {
6527              if ( $attribute_value ) {
6528                  $attributes_string .= ' ' . esc_attr( $attribute_name );
6529              }
6530          } else {
6531              $attributes_string .= sprintf( ' %1$s="%2$s"', esc_attr( $attribute_name ), esc_attr( $attribute_value ) );
6532          }
6533      }
6534      return $attributes_string;
6535  }


Generated : Mon Jun 15 08:20:09 2026 Cross-referenced by PHPXref