2016-05-15 9 views
0

Ich habe seit ein paar Tagen mit diesem Problem gekämpft und ich hoffe wirklich, dass Sie mir helfen können.Frontend benutzerdefinierte Beitragseinreichung Ergebnisse in wp_insert_post() undefined

Ich habe ein Plugin erstellt, die in befinden:

'/ wp-content/plugins/my-cool-Plugin'.

Mein Plugin erlaubt Benutzern, einen benutzerdefinierten Beitragstyp über ein Formular auf einer öffentlichen Seite zu posten, grundsätzlich sollte jeder in der Lage sein, etwas zu posten. Mit jQuery, höre ich zu, wenn mein Frontend-Formular übergeben wird und mit Ajax übergebe ich die Daten aus dem Formular in eine PHP-Datei, um es in einen Post zu verarbeiten. Diese Datei befindet sich unter:

'/wp-content/plugins/my-cool-plugin/inc/processor.php'.

Unten ist der Inhalt meiner Prozessor-Datei:

$var1= $_POST['some']; 
$var2= $_POST['data']; 

$new_post = array(
    'post_type'   => 'my_custom_post', 
    'post_status'  => 'publish', 
    'mcp_1'    => $var1, 
    'mcp_2'    => $var2 
); 

$post_id = wp_insert_post($new_post, $wp_error); 
if ($wp_error == 'false'){ 
    $post_url = get_permalink($post_id); 
    echo $post_url; 
}else { 
    // some sort of error 
} 

Wenn ich meine Form testen, führt dies zu dem folgenden Fehler:

Call to undefined function wp_insert_post() in Zeile ... die ist die folgende Zeile:

Muss ich etwas hinzufügen, da ich nicht mehr im WordPress-Bereich bin? Oder gibt es eine andere (viel bessere) Möglichkeit zum Einfügen von benutzerdefinierten Posts aus einem Front-End-Formular?

Antwort

0

Ich brauchte einige Zeit, um Nicks Antwort zu verarbeiten, aber ich habe es endlich zur Arbeit gebracht! Wie Nick schon sagte, habe ich die Prozessdatei fallen gelassen, weil sie außerhalb des Umfangs von WordPress lag. Ich habe meine Post-Erstellung aus meiner proces-Datei in eine neue Funktion in der Plugin-Init-Datei (my-cool-plugin.php) verschoben, wie Nick vorgeschlagen hat. Daraus ergab sich die folgende neue Funktion:

add_action('wp_ajax_coolplugin_create_post', 'coolplugin_create_post'); 
add_action('wp_ajax_nopriv_coolplugin_create_post', 'coolplugin_create_post'); 

function coolplugin_create_post() { 
    $var1 = $_POST['some']; 
    $var2 = $_POST['data']; 

    $new_post = array(
     'post_type'   => 'my_custom_post', 
     'post_status'  => 'publish' 
     'post_title'  => 'Some title' 
    ); 

    $post_id = wp_insert_post($new_post, $wp_error); 

    // check if there is a post id and use it to add custom meta 
    if ($post_id) { 
     update_post_meta($post_id, 'mcp_1', $var1); 
     update_post_meta($post_id, 'mcp_2', $var2); 
    } 

    if ($wp_error == false){ 
     $post_url = get_permalink($post_id); 
     echo $post_url; 
    }else { 
     // some sort of error 
    } 
} 

Ich hatte auch die Art und Weise zu ändern, die ich meine benutzerdefinierte Werte in die neu geschaffene Position eingefügt, weil die wp_insert_post() Funktion akzeptiert nur Standard-Post-Parameter (die wp_insert_post documentation für diese Parameter sehen) .

Neben meiner Funktion zum Einfügen/Erstellen von Post musste ich auch einige Anpassungen an meiner Javascript-Datei vornehmen, die die ausgefüllten Daten aus meinem Formular abruft.Deshalb (als Nick vorgeschlagen) brauchte ich meine Ajax URL von PHP zu JS passiere durch die folgende Funktion my-cool-plugin.php wie folgt ergänzt:

function your_plugin_ajaxurl() { ?> 
    <script type="text/javascript"> 
     var coolPluginAjaxUrl = "<?php echo admin_url('admin-ajax.php'); ?>"; 
    </script> 
<?php } 

add_action('wp_head','your_plugin_ajaxurl'); 

Durch das Hinzufügen des coolPluginAjaxUrl Variable auf den Kopf ich in der Lage bin, die URL zu verwenden, in mein Javascript um die Daten zu schreiben, wenn mein Formular abgeschickt wird, wie folgt aus:

$('#form').on('submit', function(e) { 
    var request; 

    e.preventDefault(); 
    var val_one = $('#val-one').val(); 
    var val_two = $('#val-two').val(); 

    var formData = { 
     action: 'coolplugin_create_post', 
     some: val_one, 
     data: val_two, 
    }; 

    request = $.ajax({ 
     type: 'POST', 
     url: coolPluginAjaxUrl, 
     data: formData, 
    }); 
}); 

die formData hält die coolplugin_create_post Aktion definiert in PHP und die Anforderung an die coolPluginAjaxUrl URL geschrieben, im Kopf definiert.

Dank Nick für mich in die richtige Richtung und ich hoffe, dass meine Lösung auch anderen helfen wird. Bitte beachten Sie, dass ich meinen Code für verschiedene Sicherheitsmaßnahmen entfernt habe, damit andere leicht verstehen, wie der Code funktioniert.

0

Versuchen Zugabe

require(dirname(__FILE__) . '/wp-load.php'); 
+0

Meine Datei befindet sich nicht im WordPress-Bereich, daher wird die 'wp-load.php' Datei im Ordner der Datei gesucht, die die' wp-load.php' Datei benötigt. Das bedeutet, dass das request nach 'wp-load.php' in meinem'/wp-content/plugins/my-cool-plugin/inc/'Ordner sucht. – Tomjesch

1

Warum sind Sie die Datei aus dem Wordpress-Rahmen ausgeführt wird? Das ist nicht die beste Übung. Stattdessen könnten Sie es in Wordpress-Bereich und Benutzer Wordpress native Ajax ausführen.

add_action('wp_ajax_yourplugin_create_post', 'yourplugin_create_post'); 
add_action('wp_ajax_nopriv_yourplugin_create_post', 'yourplugin_create_post'); 

function yourplugin_create_post() { 
// your code here 
} 

Dann würden Sie Ihre Ajax-URL müssen von PHP js weitergegeben werden:

function your_plugin_ajaxurl() { 
?> 
<script type="text/javascript"> 
var yourPluginAjaxUrl = "<?php echo admin_url('admin-ajax.php'); ?>"; 
</script> 
<?php 
} 

add_action('wp_head','your_plugin_ajaxurl'); 

Dann können Sie Ihre Ajax-Anforderung verwenden, aber Sie müssten Aktion, um anzuzeigen: yourplugin_create_post und url = yourPluginAjaxUrl

+0

Hallo Nick, danke für deine Antwort. Es hat mir sehr geholfen, meine Antwort zu finden! – Tomjesch