Załączniki do wpisu (lista załączników)

WordPress ma kilka wad, które niestety nie zostaną szybko rozwiązanie. Moje przyzwyczajenie do innego modelu dołączania załączników jest wypaczone innym systemem, w którym to przez kilka lat pracowałem.

Mój model dołączania załączników do treści wygląda następująco. Wybieramy załączniki do wpisu z biblioteki mediów i on je nam przypisuje do wpisu tworząc sortowalną listę. Lista załączników powinna się ukazać pod pełnym wpisem.

Zatem, żeby nie przedłużać mojego wpisu pokrótce przedstawię kod wtyczki.

W pierwszej kolejności musimy stworzyć meta box, do którego będą wstawiane załączniki.

add_meta_box('attachments', __( 'Załączniki', 'lang' ), 'attachments_box', 'post', 'normal', 'high' );

Następnie musimy stworzyć funkcję attachments_box, która będzie nam ten boks wyświetlała. Na samym początku będziemy pobierali własne meta wpisów – czyli listę załączników.

global $wpdb, $blog_id, $current_user;
$attach = array();
$row = get_post_meta( $post->ID, 'attachments', true );
$attach = maybe_unserialize($row);
if( empty( $attach ) ) $attach = array(0);
$attachments = new WP_Query( array( 'posts_per_page' => '-1', 'post_type' => 'attachment', 'post__in' => $attach, 'post_status' => 'inherit', 'orderby' => 'post__in' ) );

Domyślnie lista załączników jest serializowana. Zserializowane dane to tylko ID załącznika z bazy, więc dołączane pliki będą miały taki sam tytuł i opis jak e bibliotece mediów.

Do wtyczki musimy również dołączyć trochę kodu javascript, głównie odpowiedzialnego za umożliwienie sortowania listy załączników oraz ich wyboru z menedżera plików.

			jQuery(document).ready(function($){
				$( ".filesort" ).sortable();
				$("a.remove").on("click", function (e) {
					e.preventDefault();
					$(this).parent().remove();
				});
				var custom_uploader;
				$('#upload_image_button').click(function(e) {
						e.preventDefault();
						if (custom_uploader) {
								custom_uploader.open();
								return;
						}
						custom_uploader = wp.media.frames.file_frame = wp.media({
								title: 'Add attachments',
								button: {
										text: 'Select'
								},
								multiple: true
						});
					custom_uploader.on('select', function() {
						var selection = custom_uploader.state().get('selection');
						selection.map( function( attachment ) {
							attachment = attachment.toJSON();
							$("#obal").append('
  • ' + attachment.title + ' x
  • '); }); }); custom_uploader.open(); }); });

    W pierwszej kolejności tworzymy listę sortowalną, czyli wykorzystując bibliotekę jquery sortable umożliwiamy sortowanie listy załączników. Najważniejsza funkcja js wywołuje menedżera mediów i dodaje załączniki do listy.

    Od strony administratora pozostaje nam jedynie zapisanie meta danych wpisu.

    	function save_post_meta( $post_id ) {
    		global $post;
    		$_POST = stripslashes_deep( $_POST );
    		$attach = null;
    		$post_type = null;
    		extract($_POST);
    		
    		if ( $post_id === null || ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) ) return;
    		if( $post_type != 'post') return;
    		
    		if ( !current_user_can( 'edit_post', $post_id ) ) return;
    		
    		if( is_array( $attach ) ) {
    			$attachments = maybe_serialize( $attach );
    			add_post_meta( $post_id, 'attachments', esc_sql( $attachments ), true ) || update_post_meta( $post_id, 'attachments', esc_sql( $attachments ) );
    			unset( $data );
    		}
    	}
    

    Lista załączników jest automatycznie dołączana do wpisów, poprzez filtr. Wyświetla on listę na pojedynczej stronie (single.php).

    To tyle. Wtyczka do pobrania poniżej. Pytania kierować poniżej :).

    Załączniki wpisu:
    • Lista załączników
      Wtyczka tworząca listę plików do pobrania pod wpisem
      Data: 2014-03-27 17:36:02 Rozmiar: 17 KB

    You may also like...