Atașează fișier PDF la un tip de postare personalizat
Încerc să atașez un fișier PDF la un tip de postare personalizat.
Am găsit acest fragment de cod pe wpsnipp.com.
Codul funcționează, dar doar pentru postări normale.
Am un tip de postare personalizat numit 'events' și nu reușesc să îl fac să funcționeze.
add_action("admin_init", "pdf_init");
add_action('save_post', 'save_pdf_link');
function pdf_init(){
add_meta_box("my-pdf", "Document PDF", "pdf_link", "post", "normal", "low");
}
function pdf_link(){
global $post;
$custom = get_post_custom($post->ID);
$link = $custom["link"][0];
$count = 0;
echo '<div class="link_header">';
$query_pdf_args = array(
'post_type' => 'attachment',
'post_mime_type' =>'application/pdf',
'post_status' => 'inherit',
'posts_per_page' => -1,
);
$query_pdf = new WP_Query( $query_pdf_args );
$pdf = array();
echo '<select name="link">';
echo '<option class="pdf_select">SELECTEAZĂ FIȘIER PDF</option>';
foreach ( $query_pdf->posts as $file) {
if($link == $pdf[]= $file->guid){
echo '<option value="'.$pdf[]= $file->guid.'" selected="true">'.$pdf[]= $file->guid.'</option>';
}else{
echo '<option value="'.$pdf[]= $file->guid.'">'.$pdf[]= $file->guid.'</option>';
}
$count++;
}
echo '</select><br /></div>';
echo '<p>Selectează un fișier PDF din lista de mai sus pentru a-l atașa acestei postări.</p>';
echo '<div class="pdf_count"><span>Fișiere:</span> <b>'.$count.'</b></div>';
}
function save_pdf_link(){
global $post;
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){ return $post->ID; }
update_post_meta($post->ID, "link", $_POST["link"]);
}
add_action( 'admin_head', 'pdf_css' );
function pdf_css() {
echo '<style type="text/css">
.pdf_select{
font-weight:bold;
background:#e5e5e5;
}
.pdf_count{
font-size:9px;
color:#0066ff;
text-transform:uppercase;
background:#f3f3f3;
border-top:solid 1px #e5e5e5;
padding:6px 6px 6px 12px;
margin:0px -6px -8px -6px;
-moz-border-radius:0px 0px 6px 6px;
-webkit-border-radius:0px 0px 6px 6px;
border-radius:0px 0px 6px 6px;
}
.pdf_count span{color:#666;}
</style>';
}
function pdf_file_url(){
global $wp_query;
$custom = get_post_custom($wp_query->post->ID);
echo $custom['link'][0];
}
Și pentru a afișa link-ul în temă:
<? pdf_file_url(); ?>
Am schimbat tipul de postare din 'post' în 'events' și meta box-ul apare în pagina 'events'.
Până aici totul e bine.
Salvează PDF-ul prima dată. Și afișează link-ul corect.
Dar dacă încerc să schimb PDF-ul nu îl salvează. Îl afișează pe primul din nou.

Acesta este codul pe care l-am folosit în site-ul meu WordPress pentru tipuri de postări personalizate, pentru a adăuga PDF-uri la postări și funcționează pentru mine. Încearcă să îl modifici și să îl folosești. Sper că te va ajuta.
function add_custom_meta_boxes() {
add_meta_box('wp_custom_attachment', 'Broșură Hotel', 'wp_custom_attachment', 'hotel_post', 'normal', 'high');
}
add_action('add_meta_boxes', 'add_custom_meta_boxes');
function wp_custom_attachment() {
wp_nonce_field(plugin_basename(__FILE__), 'wp_custom_attachment_nonce');
$html = '<p class="description">';
$html .= 'Încarcă PDF-ul aici.';
$html .= '</p>';
$html .= '<input type="file" id="wp_custom_attachment" name="wp_custom_attachment" value="" size="25">';
echo $html;
}
add_action('save_post', 'save_custom_meta_data');
function save_custom_meta_data($id) {
if(!empty($_FILES['wp_custom_attachment']['name'])) {
$supported_types = array('application/pdf');
$arr_file_type = wp_check_filetype(basename($_FILES['wp_custom_attachment']['name']));
$uploaded_type = $arr_file_type['type'];
if(in_array($uploaded_type, $supported_types)) {
$upload = wp_upload_bits($_FILES['wp_custom_attachment']['name'], null, file_get_contents($_FILES['wp_custom_attachment']['tmp_name']));
if(isset($upload['error']) && $upload['error'] != 0) {
wp_die('A apărut o eroare la încărcarea fișierului. Eroarea este: ' . $upload['error']);
} else {
update_post_meta($id, 'wp_custom_attachment', $upload);
}
}
else {
wp_die("Tipul de fișier încărcat nu este un PDF.");
}
}
}
function update_edit_form() {
echo ' enctype="multipart/form-data"';
}
add_action('post_edit_form_tag', 'update_edit_form');
Pentru a obține PDF-ul
$hotel_brochure = get_post_meta( $post_id, 'wp_custom_attachment', true );
$hotel_brochure['url']

Funcționează. Totuși, lipsea această linie: add_post_meta($id, 'wp_custom_attachment', $upload); deasupra acesteia: update_post_meta($id, 'wp_custom_attachment', $upload); Mulțumesc

Mulțumesc Kuljeet Singh pentru această soluție, funcționează perfect (cu observația lui belacqua). Am o întrebare vă rog: Cum să fac ca această soluție să stocheze informațiile despre fișierul încărcat. De fapt, când actualizezi postarea, caseta personalizată te solicită să încarci un fișier dar nu indică dacă există deja un fișier încărcat. Mulțumesc anticipat

WordPress 5.6 aici. Am încercat fără add_post_meta
și funcționează. Fiți atenți totuși, deși acest cod suprascrie metadatele actualizate anterior așa cum era de așteptat, NU suprascrie fișierul încărcat anterior deoarece wp_upload_bits
folosește un nume diferit (ceva de genul file-1.pdf
, file-2.pdf
, file-3.pdf
, și așa mai departe). Verificați folderul wp-content/upload
.

De asemenea, rețineți că PHP 7 evaluează $upload['error'] != 0
la false
când $upload['error']
conține un mesaj (de tip string). Acest lucru nu mai este valabil în PHP 8, dar totuși ar trebui să utilizați verificarea strictă a tipurilor (===
) pentru a evita comportamente imprevizibile (apropo, $upload['error']
poate fi un string sau false
).

În final, citați-vă sursele: https://code.tutsplus.com/articles/attaching-files-to-your-posts-using-wordpress-custom-meta-boxes-part-1--wp-22291 :-P Câteva informații suplimentare referitoare la cele două comentarii de mai sus: https://wordpress.stackexchange.com/a/379569/198773.

Am reușit să fac asta să funcționeze aseară folosind codul de mai sus (și comentariul suplimentar) și aș vrea să adaug câteva lucruri aici. În primul rând, în secțiunea "Pentru a obține PDF-ul", 'wpcf-brochure' ar trebui schimbat în 'wp_custom_attachment'. Apoi, pentru a răspunde la ultima întrebare din OP, pentru a-l face să apară în interfața de administrare, iată tehnica pe care am folosit-o. Înainte de linia care spune "echo $html;" în functions.php, adăugați:
$filearray = get_post_meta( get_the_ID(), 'wp_custom_attachment', true );
$this_file = $filearray['url'];
if($this_file != ""){
$html .= '<div>Fișier curent:<br>"' . $this_file . '"</div>';
}

Iată un mic impuls pentru cei care doresc să remedieze și să corecteze răspunsul acceptat:
define('PREFIX', 'a-good-prefix-');
echo '<input type="file" name="' . PREFIX . 'attachment">';
add_action('save_post', function ($post_id) {
$key = PREFIX . 'attachment';
if (empty($_FILES[$key]['name'])) return;
if (metadata_exists('post', $post_id, $key)) {
unlink(get_post_meta($post_id, $key, true)['file']);
}
$name = $_FILES[$key]['name'];
$tmp = $_FILES[$key]['tmp_name'];
$bits = file_get_contents($tmp);
$upload = wp_upload_bits($name, null, $bits);
if (isset($upload['error']) && $upload['error'] !== false) {
wp_die('Eroare la încărcare: ' . $upload['error']);
} else {
update_post_meta($post_id, $key, $upload);
}
});
Surse actuale: https://code.tutsplus.com/articles/attaching-files-to-your-posts-using-wordpress-custom-meta-boxes-part-1--wp-22291.
