need to update a custom field value if it is blank mis if it has any value not want to do anything
I want to update only if it is empty
code:
$custom_fields = get_post_custom($post_ID);//Current post id
$my_custom_field = $custom_fields['artist'];//key name
foreach ( $my_custom_field as $key => $value );
if(empty($value) or ($value == '')){
$artist_v = get_post_custom_values('artist', $post_ID);
update_post_meta($post_ID, 'artist', $parent_title, $artist_v);
}else{
//add_post_meta($post_ID, 'artist', $parent_title, true);
}
Below example might help:
`
if(!empty($ARR_meta_data))
{
foreach($ARR_meta_data as $meta)
{
if(trim($meta['meta_value']) == "")
{
update_postmeta_by_meta_id($meta['meta_id'], " YOUR CUSTOM VALUE ");
}
}
}
function get_postmeta_details_in_array($post_id, $meta_key)
{
global $wpdb;
$sql = "SELECT * FROM ".$wpdb->prefix."postmeta
WHERE meta_key='{$meta_key}' AND post_id='{$post_id}'";
return $wpdb->get_results($sql, ARRAY_A);
}
function update_postmeta_by_meta_id($meta_id, $meta_value)
{
global $wpdb;
$sql = "UPDATE ".$wpdb->prefix."postmeta SET meta_value='$meta_value'
WHERE meta_id='$meta_id'";
return $wpdb->query($sql);
}
?>
`
Place get_postmeta_details_in_array() and update_postmeta_by_meta_id() function in the functions.php in your wordpress theme.
Related
I am encountering issue whereby my post content got duplicated. I want to be able to modify the content only on first publish. I tried to use wp_insert_post_data filter but it keeps crashing. So i use save_post. Here is what I want to achieve.
Example:
This is my post and I [bbsmall]create it using[/bbsmall] save_post
Filter:
Remove tag and use only simple html tags and do many other modification.
Ideal Output:
This is my post and I create it using save_post
However, my current output is:
This is my post and I create it using save_post
This is my post and I create it using save_post
This is my code
add_action('save_post', 'my_modified_content');
function my_modified_content($post_id) {
$post_content = get_post( $post_id );
if( $post_content->post_type != "post" ) {
return;
}else{
if (isset($post_content->post_status) && 'auto-draft' == $post_content->post_status ) {
return;
}
else{
$add_extra_tag = $myweb_settings['myoption_set'];
$post_checked = get_post_meta( $post_id, 'my_post_meta_style', true );
$alreadydone = get_post_meta( $post_id, 'check_post_style', true );
if ($alreadydone!=1){
if (isset($add_extra_tag) and $add_extra_tag=="Yes"){
remove_action('save_post', 'my_modified_content');
$content = add_simple_tags($post_content->post_content);
$title =add_simple_tags($post_content->post_title);
update_post_meta($post_id, 'check_post_style', '1');
$my_post = array();
$my_post['ID'] = $post_id;
$my_post['post_title'] = $title;
$my_post['post_content'] = $content;
$my_post['post_status'] = 'publish';
wp_update_post($my_post);
add_action('save_post', 'my_modified_content');
}else{
if (isset($post_checked ) ) {
remove_action('save_post', 'my_modified_content');
$content = add_simple_tags($post_content->post_content);
$title =add_simple_tags($post_content->post_title);
update_post_meta($post_id, 'check_post_style', '1');
$my_post = array();
$my_post['ID'] = $post_id;
$my_post['post_title'] = $title;
$my_post['post_content'] = $content;
$my_post['post_status'] = 'publish';
wp_update_post($my_post);
add_action('save_post', 'my_modified_content');
}else{
return ;
}
}
}else{
return ;
}
}
}
}
Okay so I am able to fix the issue.
Instead of using save_post, I use wp_insert_post_data filter.
Previously I failed to use the filter due to the wrong format of coding and I did not return the $data.
So these are the modifications I did. Hope this is helpful for others who are facing the same issue.
add_filter('wp_insert_post_data', 'my_modified_content',10,3);
function my_modified_content($data, $postarr, $unsanitized_postarr) {
if( $data['post_type'] != "post" ) {
return;
}else{
if (isset($data['post_status']) && 'auto-draft' == $data['post_status'] ) {
return;
}
else{
$add_extra_tag = $myweb_settings['myoption_set'];
$post_checked = $postarr['my_post_meta_style'];
//Do other checks and modifications
}
}
return $data;
}
Some of my tags have some custom term meta and I'm saving that meta with this function:
add_action ( 'edit_term', 'save_termmeta_tag');
// save extra category extra fields callback function
function save_termmeta_tag( $term_id ) {
if ( isset( $_POST['Tag_meta'] ) ) {
$t_id = $term_id;
$tag_meta = get_option( "tag_$t_id");
$tag_keys = array_keys($_POST['Tag_meta']);
foreach ($tag_keys as $key){
if (isset($_POST['Tag_meta'][$key])){
$tag_meta[$key] = $_POST['Tag_meta'][$key];
}
}
//save the option array
update_option( "tag_$t_id", $tag_meta );
}
}
Now, I would like to get all tag with a specific option like 'channel'.
Is this possible, and how?
function get_term_with_option($opt) {
$terms = array();
// load all options
$options = wp_load_alloptions();
foreach($options as $k=>$v) {
// find keys with prefix `tag_`
if (strpos($k, 'tag_') === 0) {
$v = maybe_unserialize($v);
// check if has a meta key $opt
if (is_array($v) && array_key_exists($opt, $v)) {
$term = get_term(intval(str_replace('tag_', '', $k)));
if (!is_wp_error($term)) {
$terms[] = $term;
}
}
}
}
return $terms;
}
print_r(get_term_with_option('channel'));
I'm doing a dropdown in my post custom type just to filter the content when is completed or not.
my meta_value is a serialize object like "a:3:{s:5:"email";s:21:"mrsxcvsfesr#gmail.com";s:9:"store";s:6:"testes";s:5:"token";s:34:"$P$B7efpLZUWWyB4QkhG0YaYyIwXRAj.3.";}"
and my job is to check if the token is null or not
CustomPostTypeController.php
add_action('restrict_manage_posts',[ $this, 'dropdown_status_filter']);
add_filter( 'parse_query', [ $this, 'filter_request_query'])
public function dropdown_status_filter($post_type){
if('ctp_dasboard' !== $post_type) {
return; //filter your post
}
$selected = '';
$request_attr = 'status_filter';
if ( isset($_REQUEST[$request_attr]) ) {
$selected = $_REQUEST[$request_attr];
}
echo '<select id="status_filter-loc" name="status_filter">';
echo ($selected === '1') ? "'<option value='1' selected>Done</option>'" : "'<option value='1'>Done</option>'";
echo ($selected === '2') ? "'<option value='2' selected>Pending</option>'" : "'<option value='2'>Pending</option>'";
echo '</select>';
}
public function filter_request_query($query){
//modify the query only if it admin and main query.
if( !(is_admin() AND $query->is_main_query()) ){
return $query;
}
//we want to modify the query for the targeted custom post and filter option
if( !('ctp_dasboard' === $query->query['post_type'] AND isset($_REQUEST['status_filter']) ) ){
return $query;
}
//for the default value of our filter no modification is required
if(0 == $_REQUEST['status_filter']){
return $query;
}
//modify the query_vars.
// $value = "";
// var_dump($_REQUEST['status_filter'] === '1');
if ( $_REQUEST['status_filter'] === '1'){
// global $wpdb;
// $meta_key = 'form_ctp';
// $meta_value = '"token";N;';
// $mid = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE meta_key = %s AND meta_value LIKE %s ", $meta_key, $meta_value) );
// dd($mid);
// // The Query
$args = [
'post_type' => 'ctp_dasboard',
['meta_query' => [
'key' => 'form_ctp',
'value' => 'token";N;', // this is when token is null
'compare' => 'IN'
]]
];
// dd($args);
$query = new \WP_Query( $args );
// dd($the_query);
}
if ( $_REQUEST['status_filter'] === '2'){
}
return $query;
}
There is a special function maybe_unserialize which can return you unserialized data array/ string and etc. Check documentation. Your variable should look like this:
$str = "a:3{s:5:"email";s:21:"mrsxcvsfesr#gmail.com";s:9:"store";s:6:"testes";s:5:"token";s:34:"$P$B7efpLZUWWyB4QkhG0YaYyIwXRAj.3.";}";
$data = maybe_unserialize($str); // will return an array
Need to add blank and already exist validation for 'supports' => array( 'title') on my custom post type. But i dont want to use any plugin for this.
Thanks in advance.
add_action( 'admin_notices', 'custom_error_notice' );
function custom_error_notice(){
global $current_screen, $post;
if ( $current_screen->parent_base == 'edit' ){
if((!$post->post_name) && $_GET['post']) {
wp_redirect(admin_url('post-new.php?empty=1'));
}
if($_GET['empty']) echo '<div class="error"><p>Warning - Please fill up all fields correctly!</p></div>';
}
}
But this not working properly.
This may help you:-
add_action('save_post', 'album_save_post', 10, 2);
function album_save_post( $album_id, $album ) {
if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE || $album->post_type != 'music_album') return;
// echo '<pre>';
// print_r($album);
// echo '</pre>';
// die();
$errors = array();
// Validation filters
$title = $album->post_title;
if ( ! $title ) {
$errors['title'] = "The title is required";
}
// if we have errors lets setup some messages
if (! empty($errors)) {
// we must remove this action or it will loop for ever
remove_action('save_post', 'album_save_post');
// save the errors as option
update_option('album_errors', $errors);
// Change post from published to draft
$album->post_status = 'draft';
// update the post
wp_update_post( $album );
// we must add back this action
add_action('save_post', 'album_save_post');
// admin_notice is create by a $_GET['message'] with a number that wordpress uses to
// display the admin message so we will add a filter for replacing default admin message with a redirect
add_filter( 'redirect_post_location', 'album_post_redirect_filter' );
}
}
function album_post_redirect_filter( $location ) {
// remove $_GET['message']
$location = remove_query_arg( 'message', $location );
// add our new query sting
$location = add_query_arg( 'album', 'error', $location );
// return the location query string
return $location;
}
// Add new admin message
add_action( 'admin_notices', 'album_post_error_admin_message' );
function album_post_error_admin_message() {
if ( isset( $_GET['album'] ) && $_GET['album'] == 'error' ) {
// lets get the errors from the option album_errors
$errors = get_option('album_errors');
// now delete the option album errors
delete_option('album_errors');
$display = '<div id="notice" class="error"><ul>';
// Because we are storing as an array we should loop through them
foreach ( $errors as $error ) {
$display .= '<li>' . $error . '</li>';
}
$display .= '</ul></div>';
// finally echo out our display
echo $display;
// add some jQuery
?>
<script>
jQuery(function($) {
$("#title").css({"border": "1px solid red"})
});
</script>
<?php
}
}
i got the solution.
/** ADD Validation for title */
function force_post_title_init()
{
wp_enqueue_script('jquery');
}
function force_post_title()
{
echo "<script type='text/javascript'>\n";
echo "
jQuery('#publish').click(function(){
var testervar = jQuery('[id^=\"titlediv\"]')
.find('#title');
if (testervar.val().length < 1)
{
jQuery('[id^=\"titlediv\"]').css('border', '1px solid red');
alert('Post title is required');
return false;
}
});
";
echo "</script>\n";
}
add_action('admin_init', 'force_post_title_init');
add_action('edit_form_advanced', 'force_post_title');
// Add this row below to get the same functionality for page creations.
add_action('edit_page_form', 'force_post_title');
May be this also help for all of you.
Is it possible to create a function similar to this one
function add_category_automatically($post_ID) {
global $wpdb;
$postsWeWants = $wpdb->get_results("SELECT ID, post_author FROM $wpdb->posts where ID = $post_ID");
foreach ($postsWeWants as $postsWeWant) {
if(($postsWeWant->post_author != 30) && ($postsWeWant->post_author != 29) && !in_category('bundle')){
$cat = array(9547,9742);
wp_set_object_terms($post_ID, $cat, 'category', true);
}
}
}
add_action('publish_post', 'add_category_automatically');
but based on the post class instead of author and category?
something like that should do the trick:
function add_category_by_class($post_ID) {
if( in_array( 'classToCheckFor' get_post_class('', $post_ID)) ){
$cat = array(9547,9742);
wp_set_object_terms($post_ID, $cat, 'category', true);
}
}
add_action('publish_post', 'add_category_by_class');