Attachment Hooks
Custom hooks Jetonomy fires so themes and extensions (including Jetonomy Pro) can
extend behavior without editing plugin files. This page currently covers the
attachment seam added in 1.8.0. See includes/class-attachments.php and
includes/models/class-attachment.php for the source of truth.
Attachment filters
These three filters are the entire seam between free's basic attachment
renderer and Pro's richer one. Pro hooks all three in
jetonomy-pro/includes/extensions/attachments/class-extension.php; a site
without Pro still shows images inline and other files as download links.
jetonomy_attachment_card
Filters one attachment's card HTML before it's added to the list.
apply_filters( 'jetonomy_attachment_card', string $card, array $attachment, string $object_type, int $object_id ): string
$card— free's default<li>markup (image card or file card).$attachment— hydrated attachment array, seeAttachment::hydrate().$object_type—'post'or'reply'.$object_id— the post or reply id.
Fired once per attachment inside Attachments::render(). Pro returns its own
card (lightbox image, inline PDF.js viewer, typed chip) instead of free's.
add_filter( 'jetonomy_attachment_card', function ( $card, $attachment, $object_type, $object_id ) {
if ( 'pdf' === $attachment['type'] ) {
return my_render_pdf_card( $attachment );
}
return $card;
}, 10, 4 );
jetonomy_attachments_class
Filters the wrapper <ul> class name, default jt-attachments.
apply_filters( 'jetonomy_attachments_class', string $class ): string
Let a richer renderer swap in its own container class so its own CSS targets the strip, without colliding with free's default styling.
jetonomy_rest_attachment_data
Filters one attachment's REST/render data array.
apply_filters( 'jetonomy_rest_attachment_data', array $data, string $object_type, int $object_id ): array
Fired once per row inside Attachment::payload_for() — the same call that
backs both the frontend card renderer and the REST payload, so the two can
never drift. $data is the shape documented in
Attachment::hydrate(). Pro uses this to swap in a
gated download URL for non-image files and to add PDF page counts.
REST payload — attachments
As of 1.8.0, jetonomy_rest_prepare_post and jetonomy_rest_prepare_reply
(existing REST payload filters) carry an attachments array, injected by
Attachments::inject_post_payload() / inject_reply_payload() in
includes/class-attachments.php. This is free — a site without Pro still
serves attachment data to the mobile app and any REST consumer.
Each item in attachments has this shape:
| Key | Type | Description |
|---|---|---|
id |
int | WordPress media (attachment) ID. |
link_id |
int | The jt_attachments row id (use this to unlink). |
url |
string | Full-size file URL. |
thumb |
string | Thumbnail/medium image URL, or '' for non-images. |
mime |
string | MIME type. |
name |
string | Real filename with extension. |
size |
int | File size in bytes, 0 if unknown. |
type |
string | 'image', 'pdf', or 'file'. |
ext |
string | Uppercased file extension (e.g. PDF). |
is_image |
bool | Convenience flag, true when type === 'image'. |
Note the naming reads backwards on purpose: id is the WP media ID, link_id
is the jt_attachments row id. That's the shape the mobile app already
consumed from Pro before the table moved to free, and is not worth breaking
clients over.