Atașează fișier PDF la un tip de postare personalizat

21 iun. 2013, 10:04:25
Vizualizări: 20.4K
Voturi: 3

Î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.

2
Comentarii

Care este utilitatea array-ului $pdf? Dacă nu este necesar, elimină-l și verifică dacă funcționează.

Rajeev Vyas Rajeev Vyas
21 iun. 2013 10:38:17

Mulțumesc. Se pare că nu avea nicio utilitate. L-am comentat și nu s-a schimbat nimic. Problema rămâne însă aceeași.

belacqua16 belacqua16
21 iun. 2013 11:00:01
Toate răspunsurile la întrebare 3
6
11

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']
21 iun. 2013 11:03:45
Comentarii

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

belacqua16 belacqua16
21 iun. 2013 12:57:11

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

whiteletters in blankpapers whiteletters in blankpapers
19 iul. 2013 02:03:02

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.

leaf leaf
9 dec. 2020 15:20:16

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).

leaf leaf
9 dec. 2020 16:22:44

Î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.

leaf leaf
9 dec. 2020 17:33:07

funcționează acest cod? Am testat și am încărcat fișierul pdf, dar după ce am dat click pe butonul de publicare, tipul fișierului a fost șters.

user9437856 user9437856
16 dec. 2021 10:02:46
Arată celelalte 1 comentarii
0

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>';
}
22 iul. 2014 21:53:29
0

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.

9 dec. 2020 16:46:47