# Plugin: Docx to Post # Directory: docx-to-post/ # Files included below. Create the folder `wp-content/plugins/docx-to-post/` and place these files accordingly. ==================== File: docx-to-post.php ==================== ==================== File: assets/admin.css ==================== .d2p-wrap { max-width: 1100px; } .d2p-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 12px; } .d2p-card { background: #fff; border: 1px solid #ccd0d4; padding: 16px; border-radius: 6px; } #d2p-preview { min-height: 300px; background: #fff; border: 1px dashed #ccd0d4; padding: 16px; border-radius: 6px; } #d2p-convert-status { margin-top: 8px; color: #555; } @media (max-width: 900px){ .d2p-grid{ grid-template-columns: 1fr; } } ==================== File: assets/admin.js ==================== (function($){ const $file = $('#d2p-file'); const $convert = $('#d2p-convert'); const $status = $('#d2p-convert-status'); const $preview = $('#d2p-preview'); const $title = $('#d2p-title'); const $create = $('#d2p-create'); const $statusSel = $('#d2p-status'); const $cats = $('#d2p-categories'); const $tags = $('#d2p-tags'); const $ptype = $('#d2p-post-type'); let lastHtml = ''; function filenameNoExt(name){ return name.replace(/\.[^/.]+$/, '').replace(/[\-_]+/g,' ').trim(); } function deriveTitle(html, fallback){ const tmp = document.createElement('div'); tmp.innerHTML = html; const h1 = tmp.querySelector('h1'); const h2 = tmp.querySelector('h2'); const t = (h1?.textContent || h2?.textContent || '').trim(); return t || fallback || 'Untitled'; } $file.on('change', function(){ $convert.prop('disabled', this.files.length === 0); $status.text(''); }); $convert.on('click', async function(){ const f = $file[0].files[0]; if(!f){ return; } if(!f.name.toLowerCase().endsWith('.docx')){ alert('Please choose a .docx file.'); return; } $status.text('Converting…'); $preview.html(''); try{ const arrayBuffer = await f.arrayBuffer(); const result = await window.mammoth.convertToHtml({ arrayBuffer }); lastHtml = result.value || ''; if(!lastHtml){ $status.text('No content found in the document.'); return; } $preview.html(lastHtml); if(!$title.val()){ $title.val(deriveTitle(lastHtml, filenameNoExt(f.name))); } $status.text('Converted. Review the preview (you can edit it).'); $create.prop('disabled', false); } catch(err){ console.error(err); alert('Conversion failed: ' + (err?.message || err)); $status.text(''); } }); $create.on('click', function(){ const payload = { action: 'd2p_create_post', nonce: D2P.nonce, title: $title.val().trim() || 'Untitled', status: $statusSel.val(), categories: $cats.val(), tags: $tags.val(), post_type: $ptype.val(), content: $preview.html() // include edited HTML with data-URI images }; $create.prop('disabled', true).text('Creating…'); $.post(D2P.ajaxUrl, payload).done(function(resp){ if(resp && resp.success){ $create.text('Created ✓'); const link = resp.data && resp.data.link ? resp.data.link : '#'; alert('Post created!\n' + link); window.open(link, '_blank'); } else { $create.prop('disabled', false).text('Create Post'); alert('Error: ' + (resp && resp.data && resp.data.message ? resp.data.message : 'Unknown')); } }).fail(function(xhr){ $create.prop('disabled', false).text('Create Post'); const msg = xhr?.responseJSON?.data?.message || xhr.statusText || 'Unknown error'; alert('Failed: ' + msg); }); }); })(jQuery); https://pickleballscan.com/wp-sitemap-posts-post-1.xmlhttps://pickleballscan.com/wp-sitemap-posts-page-1.xmlhttps://pickleballscan.com/wp-sitemap-taxonomies-category-1.xmlhttps://pickleballscan.com/wp-sitemap-users-1.xml