Monat: Juni 2014

Erste Erfahrungen mit dem Media Uploader ab WP Version 3.5

18. Juni 2014 - wordpress

Vom API des neuen Media Uploaders gibt es keine offizielle WordPress Dokumentation, auch keinen halboffiziellen Artikel eines WP Insiders.

English Summary: WordPress new Media Uploader works in the dashboard from version 3.5 on but is somehow concealed because there is no official documentation. Or to be more precise: there is no documentation at all, just the core  code. Though many theme or shop developers consider it an essential and indispensable component in a CMS system.

Fortunately some developers dug through the core code and shared their experiences with the community. Solutions to implement the media uploader rank from rather simple to very complicated.

Als einziges Hilfsmittel steht der community nur der core code zur Verfügung, wenn der media uploader eingesetzt werden soll. In dieser Hinsicht hat sich jedenfalls nichts verbessert

Die Lösungen sind: eher einfach, mittelkomplex oder hochkomplex

Ich verwende die eher einfache Variante, gefunden bei http://stackoverflow.com/questions/13847714/wordpress-3-5-custom-media-upload-for-your-theme-options und etwas für mich modifiziert

jQuery(document).ready(function () {
    
    jQuery('.custom_media_upload').click(function(e) {
        var $this = jQuery(this).parent();
        e.preventDefault();
        
        var send_attachment_bkp = wp.media.editor.send.attachment;

        wp.media.editor.send.attachment = function(props, attachment) {
            $this.find('img').attr('src', attachment.url);
            $this.find (':input').val(attachment.url);

            wp.media.editor.send.attachment = send_attachment_bkp;
        }
        wp.media.editor.open();

        return false;       
    });
    jQuery('.custom_media_remove').click(function(e) {
        var $this=jQuery(this).parent();
        e.preventDefault();
        $this.find('img').attr('src',my_param2.EmptyImageUrl);
        $this.find(':input').val('');
        return false;       
    });
});

.custom_media_upload ist die Klasse aller Links, die den Media uploader starten sollen. Die Bild url wird als src Attribut in das zugehörige img Tag geschrieben (zur Anzeige des Bildes) und in ein zusätzliches input Feld, das zum Speichern in der Datenbank benutzt wird. Ausserdem gibt es auch noch Funktionalität zum Entfernen bes Bildes, was aber nicht immer notwendig ist.

Die komplexere Methode steht im gleichen Artikel, geschrieben vom User Omar Jackman.

Richtig komplex wird es dann bei Mike Jolly http://mikejolley.com/2012/12/using-the-new-wordpress-3-5-media-uploader-in-plugins/ und  http://shibashake.com/wordpress-theme/how-to-add-the-wordpress-3-5-media-manager-interface-part-2

Zu diesen Lösungen kann ich nicht viel sagen und scheue mich auch davor, viel Arbeit hinein zu stecken. Am Ende stolpert man über einen Tippfehler des Autors und sitzt viele Stunden an der Behebung.

 

Das Fehlen von Dokumentation und die Art der Implementierung sorgt für einige Empörung. In http://wordpress.org/support/topic/the-wp-media-manager-is-absolutely-terrible gibt es fast "turbulente"  Diskussionen 🙂

jqgrid multiselect in Apple and Windows Style – Mehrfachselektion von Tabellenzeilen

16. Juni 2014 - JavaScript

Oleg von Trirand.com hat auf stackoverflow eine Lösung angegeben, bei der man in jqgrid Tabellenzeilen wie unter Windows mit Shift- und Control-Key selektieren kann. Die daraus entwickelte Lösung ist auch noch zum Apple (Command-key) kompatibel

 

English Summary: Below a solution for  jqgrid multiselect that works with shift-, control- and command key in both windows and apple os style

beforeSelectRow: function (rowid, e) {
var _this = $(this), rows = this.rows,
// get id of the previous selected row
startId = _this.jqGrid('getGridParam', 'selrow'),
startRow, endRow, iStart, iEnd, i, rowidIndex;

if (!e.ctrlKey && !e.shiftKey && !e.metaKey) {
_this.jqGrid('resetSelection');
} else if (startId && e.shiftKey) {
_this.jqGrid('resetSelection');

// get DOM elements of the previous selected and the currect selected rows
startRow = rows.namedItem(startId);
endRow = rows.namedItem(rowid);
if (startRow && endRow) {
// get min and max from the indexes of the previous selected
// and the currect selected rows
iStart = Math.min(startRow.rowIndex, endRow.rowIndex);
rowidIndex = endRow.rowIndex;
iEnd = Math.max(startRow.rowIndex, rowidIndex);
for (i = iStart; i <= iEnd; i++) {
// the row with rowid will be selected by jqGrid, so:
if (i != rowidIndex) {
_this.jqGrid('setSelection', rows[i].id, false);
}
}
}

// clear text selection
if(document.selection && document.selection.empty) {
document.selection.empty();
} else if(window.getSelection) {
window.getSelection().removeAllRanges();
}
}
return true;
}
 

wordpress: problems with meta boxes, nonces and save_post

10. Juni 2014 - PHP, wordpress

If you have created a nice backend user interface in wordpress with meta boxes that add some input fields for additional information to your post and protected them with nonces, you maybe encounter a strange behaviour: custom menus cannot be saved anymore, likewise pages, likewise custom posts.... The reason is, that your function specified in the action hook doesn't stick to the rules: e.g. if you have written (as in my case 🙂 )
add_action( 'save_post', array( $this, 'saveAllCustomFields' ));

function saveAllCustomFields() {
global $post;

if ( !empty($_POST) && check_admin_referer( 'custom_field_creation','custom_fields' ) ) {
if ( !current_user_can( 'edit_post', $post->ID) )  return;
if ( $post->post_type != 'page' && $post->post_type != 'post' )  return;
$this->saveCustomFields($this->customFields1);
}

}
The nonce, created with
wp_nonce_field( 'custom_field_creation','custom_fields' );
for type 'post' will block any other type of post from beeing saved. They simply dont't know about it. Changing saveAllCustomFields to
function saveAllCustomFields() {
global $post;
if (!empty($post) && ($post->post_type == 'post')) {
if ( !empty($_POST) && check_admin_referer( 'custom_field_creation','custom_fields' ) ) {
if ( !current_user_can( 'edit_post', $post->ID) )  return;
$this->saveCustomFields($this->customFields1);
}
}
}
will set them free. Deutsche Zusammenfassung: Wenn man ein Backend-Userinterface mit Meta-Boxen und  Zusatzfeldern, die durch Nonces abgesichert werden, schreibt, kann es zu - vielleicht zunächst nicht auffallenden - Nebenwirkungen kommen. Andere Post-Typen wie Seiten, Benutzermenüs etc. können plötzlich nicht mehr gesichert werden. Der Grund dafür liegt in der Funktion, die man beim zuständigen Action-Hook 'save_post' angegeben hat (hier: saveAllCustomFields) Man muß genau darauf achten, dass der Nonce nur bei dem Post-Type überprüft wird, für den man ihn auch erzeugt hat. Ansonsten werden alle anderen Post-Types ausgesperrt.