Cum să afișezi thumbnail-uri pentru categorii în WordPress?

15 apr. 2013, 15:54:52
Vizualizări: 17.6K
Voturi: 2

În prezent am un cod în category.php care verifică dacă o categorie specifică are subcategorii și, dacă are, le afișează folosind wp_list_categories.

Aș dori ca aceste wp_list_categories să afișeze thumbnail-uri, așa că am creat un walker nou, dar nu reușesc să afișez imaginile.

Aș fi mulțumit să afișez featured image-ul din ultima postare de tip custom în această categorie, sau să folosesc un plugin.

Momentan am următorul walker în functions.php:

class Walker_Category_Parents extends Walker_Category {

    function start_el(&$output, $category, $depth, $args) {
        global $wpdb;
        extract($args);

        $link2 = ''.$category->slug.'';
        $cat_name = esc_attr( $category->name );
        $cat_name = apply_filters( 'list_cats', $cat_name, $category );
        $link = '<a href="' . esc_attr( get_term_link($category) ) . '" ';
        $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"';
        $link .= 'rel="'.$category->slug.'" ';
        $link .= '>';
        $link .= $cat_name . '</a>';
        
        if ( 'list' == $args['style'] ) {
            $output .= "\t<li";

            $children = $wpdb->get_results( "SELECT term_id FROM $wpdb->term_taxonomy WHERE parent=".$category->term_id );

            $children_count = count($children);

            $has_children = ($children_count != 0) ? ' parent-category' : '';

            $class = 'cat-item cat-item-' . $category->term_id . $has_children;
            if ( !empty($current_category) ) {
                $_current_category = get_term( $current_category, $category->taxonomy );
                if ( $category->term_id == $current_category )
                    $class .=  ' current-cat';
                elseif ( $category->term_id == $_current_category->parent )
                    $class .=  ' current-cat-parent';
            }
            $output .=  ' class="' . $class . '"';
            $output .= ">$link\n";
            $output .= "<img src='http://localhost/wp-content/themes/vom13/images/producten/";
            $output .= "$link2.png'>\n";
        } else {
            $output .= "\t$link<br />\n";
        }
    }
}

După cum poți vedea, în prezent caută imaginea într-un folder, dar asta nu este ideal deloc, pentru că nu sunt singurul care adaugă categorii, dar nu vreau să ofer tuturor acces FTP.

Există soluții?

Mulțumesc!

0
Toate răspunsurile la întrebare 2
3

Există un plugin excelent numit Taxonomy Images. Acesta vă permite să setați o imagine pentru fiecare categorie, pe care o puteți accesa apoi în diverse moduri.

Este un pic neobișnuit prin faptul că utilizează niște filtre personalizate pentru a returna imaginile, dar documentația este destul de bună și ar trebui să reușiți să vă dați seama cum funcționează.

== ACTUALIZARE == Iată un exemplu rapid care obține imaginea pe baza ID-ului (presupun că aveți deja obiectul $category din fragmentul dvs. de cod):

$images = get_option('taxonomy_image_plugin');
$cat_id = $category->term_taxonomy_id;
if( array_key_exists( $cat_id, $images ) ) {
    echo wp_get_attachment_image( $images[$cat_id] );
}

Aici găsiți o versiune ușor extinsă a acelui cod pe forumurile de suport.

15 apr. 2013 18:42:43
Comentarii

Mulțumesc! Am analizat acest plugin, dar nu am reușit să înțeleg cum să realizez asta și nu eram sigur dacă este posibil. O să mă uit din nou.

user31532 user31532
16 apr. 2013 10:03:04

Mulțumesc din nou pentru editare! Acum afișează toate imaginile, doar că nu în poziția în care aș dori să fie. (Dar cred că ar trebui să fie destul de ușor de rezolvat.)

user31532 user31532
17 apr. 2013 16:39:17

Nu este deloc ok că trebuie să încarci un plugin pentru asta. Știu că acest thread este vechi, dar recomandarea mea este să descarci pluginul Taxonomy Images așa cum a fost sugerat mai sus, să deschizi codul și să copiezi ce ai nevoie în proiectul tău. În acest fel nu ai toată "povara" paginii de setări a pluginului și a altor lucruri. WordPress ar trebui să facă asta implicit / standard.

mrwpress mrwpress
4 feb. 2020 20:49:58
0

Cred că cea mai bună metodă este să permiți administratorului să aleagă imaginea reprezentativă pentru o categorie din Biblioteca Media. Exact așa funcționează WooCommerce pentru categoriile de produse. Am verificat cum implementează WooCommerce această funcționalitate (în includes/admin/class-wc-admin-taxonomies.php) și iată codul reutilizabil (poți să-l folosești în functions.php sau într-un plugin personalizat). Poate fi folosit și cu taxonomiile post types personalizate.

<?php
/* Imagine thumbnail pentru categorie */

/* Dacă este un CPT personalizat, folosește scripturile și stilurile pentru afișarea popup-ului Biblioteca Media */
function media_uploader() {
    global $post_type;
    if( 'YOUR_CUSTOM_POST_TYPE' == $post_type) {
        if(function_exists('wp_enqueue_media')) {
            wp_enqueue_media();
        }
        else {
            wp_enqueue_script('media-upload');
            wp_enqueue_script('thickbox');
            wp_enqueue_style('thickbox');
        }
    }
}
add_action('admin_enqueue_scripts', 'media_uploader');

/*afișează câmpul din formular*/

add_action( 'YOUR_CUSTOM_POST_TYPE-category_add_form_fields', 'add_image_field', 10, 2 );
add_action( 'YOUR_CUSTOM_POST_TYPE-category_edit_form_fields', 'add_image_field', 10, 2 );
function add_image_field($taxonomy) {
    if(is_object($taxonomy)) // editare termen, nu adăugare
    $selectedimgid = get_term_meta( $taxonomy->term_id, 'YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id', true );
    
    ?>
    <div class="form-field term-thumbnail-wrap">
        <label>Imagine reprezentativă</label>
        <div id="YOUR_CUSTOM_POST_TYPE_cat_thumbnail" style="float: left; margin-right: 10px;"><img src="<?php if(isset($selectedimgid)) echo wp_get_attachment_image_src($selectedimgid)[0]; else echo "PLACEHOLDER-IMAGE-HERE.jpg";?>" width="60px" height="60px" /></div>
        <div style="line-height: 60px;">
            <input type="hidden" id="YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id" name="YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id" value="<?php if(isset($selectedimgid)) echo $selectedimgid; ?>" />
            <button type="button" class="upload_image_button button">Încarcă/Adaugă imagine</button>
            <button type="button" class="remove_image_button button">Șterge imagine</button>
        </div>
        <script type="text/javascript">

            // Afișează butonul "șterge imagine" doar când este necesar
            if ( ! jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val() ) {
                jQuery( '.remove_image_button' ).hide();
            }

            // Încărcare fișiere
            var file_frame;

            jQuery( document ).on( 'click', '.upload_image_button', function( event ) {

                event.preventDefault();

                // Dacă frame-ul media există deja, redeschide-l
                if ( file_frame ) {
                    file_frame.open();
                    return;
                }

                // Creează frame-ul media
                file_frame = wp.media.frames.downloadable_file = wp.media({
                    title: 'Alege o imagine',
                    button: {
                        text: 'Folosește imaginea'
                    },
                    multiple: false
                });

                // Când o imagine este selectată, execută un callback
                file_frame.on( 'select', function() {
                    var attachment           = file_frame.state().get( 'selection' ).first().toJSON();
                    var attachment_thumbnail = attachment.sizes.thumbnail || attachment.sizes.full;

                    jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val( attachment.id );
                    jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail' ).find( 'img' ).attr( 'src', attachment_thumbnail.url );
                    jQuery( '.remove_image_button' ).show();
                });

                // Deschide modalul
                file_frame.open();
            });

            jQuery( document ).on( 'click', '.remove_image_button', function() {
                jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail' ).find( 'img' ).attr( 'src', 'PLACEHOLDER-IMAGE-HERE.jpg' );
                jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val( '' );
                jQuery( '.remove_image_button' ).hide();
                return false;
            });

            jQuery( document ).ajaxComplete( function( event, request, options ) {
                if ( request && 4 === request.readyState && 200 === request.status
                    && options.data && 0 <= options.data.indexOf( 'action=add-tag' ) ) {

                    var res = wpAjax.parseAjaxResponse( request.responseXML, 'ajax-response' );
                    if ( ! res || res.errors ) {
                        return;
                    }
                    // Golește câmpurile Thumbnail la trimitere
                    jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail' ).find( 'img' ).attr( 'src', 'PLACEHOLDER-IMAGE-HERE.jpg' );
                    jQuery( '#YOUR_CUSTOM_POST_TYPE_cat_thumbnail_id' ).val( '' );
                    jQuery( '.remove_image_button' ).hide();
                    // Golește câmpul Display type la trimitere
                    jQuery( '#display_type' ).val( '' );
                    return;
                }
            } );

        </script>
        <div class="clear"></div>
    </div>
    <?php
    
}
7 aug. 2021 17:24:30