¿Cómo agregar imagen destacada para categoría (sin plugin)?
Estoy buscando plugins que agreguen la opción de imágenes destacadas para categorías, pero no cómo programarlo uno mismo.

Me había pasado por alto que puedes agregar campos fácilmente a los términos de taxonomía con Advanced Custom Fields: https://www.advancedcustomfields.com/resources/get-values-from-a-taxonomy-term/

No todo necesita un plugin.
Si quieres añadir un campo simple para agregar una URL de imagen, usa las funciones de WordPress add_term_meta(), update_term_meta() y get_term_meta().
function addTitleFieldToCat(){
$cat_title = get_term_meta($_POST['tag_ID'], '_pagetitle', true);
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_page_title"><?php _e('Título de la página de categoría'); ?></label></th>
<td>
<input type="text" name="cat_title" id="cat_title" value="<?php echo $cat_title ?>"><br />
<span class="description"><?php _e('Título para la categoría'); ?></span>
</td>
</tr>
<?php
}
add_action ( 'edit_category_form_fields', 'addTitleFieldToCat');
function saveCategoryFields() {
if ( isset( $_POST['cat_title'] ) ) {
update_term_meta($_POST['tag_ID'], '_pagetitle', $_POST['cat_title']);
}
}
add_action ( 'edited_category', 'saveCategoryFields');
fuente: respuesta de Luke Simmons en: Agregar campo personalizado a Categoría

Ya existen algunas soluciones para agregar campos personalizados a taxonomías. Ver: Agregar campo personalizado a Categoría
Verás una actualización de 2016 cerca del final que debería ayudarte.
Con esto puedes simplemente copiar una URL de imagen una vez que la hayas subido a tu Biblioteca Multimedia, pero supongo que quieres un Modal de Subida de Medios (ventana emergente) utilizando wp.media, ¿verdad? Tendrás que hacer eso con javascript. Esta publicación explica varios métodos para instanciar un modal de carga de medios: https://mikejolley.com/2012/12/21/using-the-new-wordpress-3-5-media-uploader-in-plugins/

<?php
add_action ( 'category_edit_form_fields', 'addTitleFieldToCat', 10, 2 );
function addTitleFieldToCat( $tag, $taxonomy ) {
$cat_title = get_term_meta( $tag->term_id, '_pagetitle', true );
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="cat_page_title"><?php _e('Título de la página de categoría'); ?></label></th>
<td>
<input type="text" name="cat_title" id="cat_page_title" value="<?php echo $cat_title ?>"><br />
<p class="description"><?php _e('Título para la categoría'); ?></p>
</td>
</tr>
<?php
}
add_action ( 'edited_category', 'saveCategoryFields' );
function saveCategoryFields() {
if ( isset( $_POST['cat_title'] ) ) {
update_term_meta( $_POST['tag_ID'], '_pagetitle', $_POST['cat_title'] );
}
}
Modificaciones de código sugeridas por el usuario @talk-nerdy-to-me - https://wordpress.stackexchange.com/users/122776/talk-nerdy-to-me
